1
0
Fork 0

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

master
blallo 2020-06-20 00:00:30 +02:00
commit 01c9cf8ad7
53 changed files with 932 additions and 506 deletions

View File

@ -233,7 +233,7 @@ class BookmarksTest {
IdlingRegistry.getInstance().register(bookmarksListIdlingResource!!)
}.openThreeDotMenu(defaultWebPage.url) {
}.clickOpenInNewTab {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}.openTabDrawer {
verifyNormalModeSelected()
}
@ -252,7 +252,7 @@ class BookmarksTest {
IdlingRegistry.getInstance().register(bookmarksListIdlingResource!!)
}.openThreeDotMenu(defaultWebPage.url) {
}.clickOpenInPrivateTab {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}.openTabDrawer {
verifyPrivateModeSelected()
}

View File

@ -62,7 +62,7 @@ class ContextMenusTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(pageLinks.url) {
verifyPageContent(pageLinks.content)
// verifyPageContent(pageLinks.content)
longClickMatchingText("Link 1")
verifyLinkContextMenuItems(genericURL.url)
clickContextOpenLinkInNewTab()
@ -85,7 +85,7 @@ class ContextMenusTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(pageLinks.url) {
verifyPageContent(pageLinks.content)
// verifyPageContent(pageLinks.content)
longClickMatchingText("Link 2")
verifyLinkContextMenuItems(genericURL.url)
clickContextOpenLinkInPrivateTab()
@ -108,7 +108,7 @@ class ContextMenusTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(pageLinks.url) {
verifyPageContent(pageLinks.content)
// verifyPageContent(pageLinks.content)
longClickMatchingText("Link 3")
verifyLinkContextMenuItems(genericURL.url)
clickContextCopyLink()
@ -129,7 +129,7 @@ class ContextMenusTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(pageLinks.url) {
verifyPageContent(pageLinks.content)
// verifyPageContent(pageLinks.content)
longClickMatchingText("Link 1")
verifyLinkContextMenuItems(genericURL.url)
clickContextShareLink(genericURL.url) // verify share intent is matched with associated URL
@ -146,7 +146,7 @@ class ContextMenusTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(pageLinks.url) {
verifyPageContent(pageLinks.content)
// verifyPageContent(pageLinks.content)
longClickMatchingText("test_link_image")
verifyLinkImageContextMenuItems(imageResource.url)
clickContextOpenImageNewTab()
@ -166,7 +166,7 @@ class ContextMenusTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(pageLinks.url) {
verifyPageContent(pageLinks.content)
// verifyPageContent(pageLinks.content)
longClickMatchingText("test_link_image")
verifyLinkImageContextMenuItems(imageResource.url)
clickContextCopyImageLocation()
@ -187,7 +187,7 @@ class ContextMenusTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(pageLinks.url) {
verifyPageContent(pageLinks.content)
// verifyPageContent(pageLinks.content)
longClickMatchingText("test_link_image")
verifyLinkImageContextMenuItems(imageResource.url)
clickContextSaveImage()
@ -214,7 +214,7 @@ class ContextMenusTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(pageLinks.url) {
verifyPageContent(pageLinks.content)
// verifyPageContent(pageLinks.content)
longClickMatchingText("Link 1")
verifyLinkContextMenuItems(genericURL.url)
mDevice.pressBack()

View File

@ -81,7 +81,7 @@ class DownloadTest {
navigationToolbar {
}.openNewTabAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
clickLinkMatchingText(defaultWebPage.content)
}
@ -99,7 +99,7 @@ class DownloadTest {
navigationToolbar {
}.openNewTabAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
clickLinkMatchingText(defaultWebPage.content)
}

View File

@ -11,7 +11,6 @@ import mozilla.components.browser.storage.sync.PlacesHistoryStorage
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
@ -71,7 +70,7 @@ class HistoryTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent("Page content: 1")
// verifyPageContent("Page content: 1")
}.openThreeDotMenu {
}.openHistory {
verifyHistoryMenuView()
@ -87,7 +86,7 @@ class HistoryTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent("Page content: 1")
// verifyPageContent("Page content: 1")
}.openThreeDotMenu {
}.openHistory {
}.openThreeDotMenu {
@ -102,7 +101,7 @@ class HistoryTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent("Page content: 1")
// verifyPageContent("Page content: 1")
}.openThreeDotMenu {
}.openHistory {
}.openThreeDotMenu {
@ -120,12 +119,12 @@ class HistoryTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent("Page content: 1")
// verifyPageContent("Page content: 1")
}.openThreeDotMenu {
}.openHistory {
}.openThreeDotMenu {
}.clickOpenInNormalTab {
verifyPageContent(firstWebPage.content)
// verifyPageContent(firstWebPage.content)
}.openTabDrawer {
verifyNormalModeSelected()
}
@ -137,12 +136,12 @@ class HistoryTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent("Page content: 1")
// verifyPageContent("Page content: 1")
}.openThreeDotMenu {
}.openHistory {
}.openThreeDotMenu {
}.clickOpenInPrivateTab {
verifyPageContent(firstWebPage.content)
// verifyPageContent(firstWebPage.content)
}.openTabDrawer {
verifyPrivateModeSelected()
}
@ -154,12 +153,11 @@ class HistoryTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent("Page content: 1")
// verifyPageContent("Page content: 1")
}.openThreeDotMenu {
}.openHistory {
}.openThreeDotMenu {
}.clickDelete {
verifyDeleteSnackbarText("Deleted")
verifyEmptyHistoryView()
}
}
@ -170,13 +168,12 @@ class HistoryTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent("Page content: 1")
// verifyPageContent("Page content: 1")
}.openThreeDotMenu {
}.openHistory {
clickDeleteHistoryButton()
verifyDeleteConfirmationMessage()
confirmDeleteAllHistory()
verifyDeleteSnackbarText("Browsing data deleted")
verifyEmptyHistoryView()
}
}
@ -187,7 +184,7 @@ class HistoryTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent("Page content: 1")
// verifyPageContent("Page content: 1")
}.openThreeDotMenu {
}.openHistory {
longTapSelectItem(firstWebPage.url)
@ -209,7 +206,7 @@ class HistoryTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent("Page content: 1")
// verifyPageContent("Page content: 1")
}.openTabDrawer {
closeTab()
}.openHomeScreen { }.openThreeDotMenu {
@ -225,14 +222,13 @@ class HistoryTest {
}
}
@Ignore("Intermittent failures: https://github.com/mozilla-mobile/fenix/issues/10642")
@Test
fun openHistoryInPrivateTabTest() {
val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent("Page content: 1")
// verifyPageContent("Page content: 1")
}.openThreeDotMenu {
}.openHistory {
longTapSelectItem(firstWebPage.url)
@ -246,7 +242,6 @@ class HistoryTest {
}
}
@Ignore("Intermittent failures: https://github.com/mozilla-mobile/fenix/issues/10642")
@Test
fun deleteMultipleSelectionTest() {
val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -254,12 +249,12 @@ class HistoryTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent("Page content: 1")
// verifyPageContent("Page content: 1")
}.openTabDrawer { }.openHomeScreen { }
navigationToolbar {
}.enterURLAndEnterToBrowser(secondWebPage.url) {
verifyPageContent("Page content: 2")
// verifyPageContent("Page content: 2")
}.openThreeDotMenu {
}.openHistory {
longTapSelectItem(firstWebPage.url)
@ -282,7 +277,7 @@ class HistoryTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent("Page content: 1")
// verifyPageContent("Page content: 1")
}.openThreeDotMenu {
}.openHistory {
longTapSelectItem(firstWebPage.url)

View File

@ -11,6 +11,7 @@ import org.mozilla.fenix.helpers.HomeActivityTestRule
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.Until
import org.junit.Ignore
import org.mozilla.fenix.helpers.ext.waitNotNull
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.ui.robots.PRIVATE_SESSION_MESSAGE
@ -116,6 +117,7 @@ class HomeScreenTest {
}
}
@Ignore("Instrumentation crash: https://github.com/mozilla-mobile/fenix/issues/11642")
@Test
fun privateModeScreenItemsTest() {
homeScreen { }.dismissOnboarding()

View File

@ -58,10 +58,10 @@ class MediaNotificationTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(videoTestPage.url) {
verifyPageContent(videoTestPage.content)
// verifyPageContent(videoTestPage.content)
clickMediaPlayerPlayButton()
waitForPlaybackToStart()
verifyPageContent("Media file is playing")
// verifyPageContent("Media file is playing")
}.openNotificationShade {
verifySystemNotificationExists(videoTestPage.title)
clickMediaSystemNotificationControlButton("Pause")
@ -92,7 +92,7 @@ class MediaNotificationTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(audioTestPage.url) {
verifyPageContent(audioTestPage.content)
// verifyPageContent(audioTestPage.content)
clickMediaPlayerPlayButton()
waitForPlaybackToStart()
}.openNotificationShade {
@ -125,10 +125,10 @@ class MediaNotificationTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(audioTestPage.url) {
verifyPageContent(audioTestPage.content)
// verifyPageContent(audioTestPage.content)
clickMediaPlayerPlayButton()
waitForPlaybackToStart()
verifyPageContent("Media file is playing")
// verifyPageContent("Media file is playing")
}.openTabDrawer {
verifyTabMediaControlButtonState("Pause")
clickTabMediaControlButton()
@ -146,10 +146,10 @@ class MediaNotificationTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(audioTestPage.url) {
verifyPageContent(audioTestPage.content)
// verifyPageContent(audioTestPage.content)
clickMediaPlayerPlayButton()
waitForPlaybackToStart()
verifyPageContent("Media file is playing")
// verifyPageContent("Media file is playing")
}.openNotificationShade {
verifySystemNotificationExists("A site is playing media")
clickMediaSystemNotificationControlButton("Pause")

View File

@ -55,10 +55,10 @@ class NavigationToolbarTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(nextWebPage.url) {
verifyPageContent(nextWebPage.content)
// verifyPageContent(nextWebPage.content)
}
// Re-open the three-dot menu for verification
@ -66,7 +66,7 @@ class NavigationToolbarTest {
}.openThreeDotMenu {
verifyThreeDotMenuExists()
}.goBack {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}
}
@ -77,12 +77,12 @@ class NavigationToolbarTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(nextWebPage.url) {
verifyPageContent(nextWebPage.content)
// verifyPageContent(nextWebPage.content)
mDevice.pressBack()
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}
// Re-open the three-dot menu for verification
@ -91,18 +91,17 @@ class NavigationToolbarTest {
verifyThreeDotMenuExists()
verifyForwardButton()
}.goForward {
verifyPageContent(nextWebPage.content)
// verifyPageContent(nextWebPage.content)
}
}
@Ignore("Intermittent failures: https://github.com/mozilla-mobile/fenix/issues/10642")
@Test
fun refreshPageTest() {
val refreshWebPage = TestAssetHelper.getRefreshAsset(mockWebServer)
navigationToolbar {
}.enterURLAndEnterToBrowser(refreshWebPage.url) {
verifyPageContent("DEFAULT")
// verifyPageContent("DEFAULT")
}
// Use refresh from the three-dot menu
@ -111,7 +110,7 @@ class NavigationToolbarTest {
verifyThreeDotMenuExists()
verifyRefreshButton()
}.refreshPage {
verifyPageContent("REFRESHED")
// verifyPageContent("REFRESHED")
}
}
@ -121,7 +120,7 @@ class NavigationToolbarTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}
}
@ -132,7 +131,7 @@ class NavigationToolbarTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(loremIpsumWebPage.url) {
verifyPageContent(loremIpsumWebPage.content)
// verifyPageContent(loremIpsumWebPage.content)
}
navigationToolbar {

View File

@ -70,7 +70,7 @@ class ReaderViewTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
verifyPageContent(readerViewPage.content)
// verifyPageContent(readerViewPage.content)
}
IdlingRegistry.getInstance().register(readerViewNotificationDot)
@ -99,7 +99,7 @@ class ReaderViewTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(genericPage.url) {
verifyPageContent(genericPage.content)
// verifyPageContent(genericPage.content)
}
readerViewRobot {
@ -120,7 +120,7 @@ class ReaderViewTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
verifyPageContent(readerViewPage.content)
// verifyPageContent(readerViewPage.content)
}
IdlingRegistry.getInstance().register(readerViewNotificationDot)
@ -152,7 +152,7 @@ class ReaderViewTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
verifyPageContent(readerViewPage.content)
// verifyPageContent(readerViewPage.content)
}
IdlingRegistry.getInstance().register(readerViewNotificationDot)
@ -187,7 +187,7 @@ class ReaderViewTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
verifyPageContent(readerViewPage.content)
// verifyPageContent(readerViewPage.content)
}
IdlingRegistry.getInstance().register(readerViewNotificationDot)
@ -222,7 +222,7 @@ class ReaderViewTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
verifyPageContent(readerViewPage.content)
// verifyPageContent(readerViewPage.content)
}
IdlingRegistry.getInstance().register(readerViewNotificationDot)
@ -263,7 +263,7 @@ class ReaderViewTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
verifyPageContent(readerViewPage.content)
// verifyPageContent(readerViewPage.content)
}
IdlingRegistry.getInstance().register(readerViewNotificationDot)

View File

@ -134,21 +134,21 @@ class SettingsBasicsTest {
homeScreen {
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(page1.url) {
verifyPageContent(page1.content)
// verifyPageContent(page1.content)
}.openThreeDotMenu {
clickAddBookmarkButton()
}
navigationToolbar {
}.enterURLAndEnterToBrowser(page2.url) {
verifyPageContent(page2.content)
// verifyPageContent(page2.content)
}.openThreeDotMenu {
clickAddBookmarkButton()
}
navigationToolbar {
}.enterURLAndEnterToBrowser(page3.url) {
verifyPageContent(page3.content)
// verifyPageContent(page3.content)
}
navigationToolbar {

View File

@ -50,7 +50,7 @@ class ShareButtonTest {
// - Visit a URL, wait until it's loaded
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}
// From the 3-dot menu next to the Select share menu

View File

@ -51,7 +51,7 @@ class SmokeTest {
homeScreen {
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
verifyNavURLBarItems()
}.openNavigationToolbar {
}.goBackToWebsite {

View File

@ -56,7 +56,6 @@ class TabbedBrowsingTest {
mockWebServer.shutdown()
}
@Ignore("Intermittent failures: https://github.com/mozilla-mobile/fenix/issues/10642")
@Test
fun openNewTabTest() {
homeScreen { }.dismissOnboarding()
@ -65,7 +64,7 @@ class TabbedBrowsingTest {
navigationToolbar {
}.openNewTabAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
verifyTabCounter("1")
}.openTabDrawer {
verifyExistingTabList()
@ -76,7 +75,6 @@ class TabbedBrowsingTest {
}
}
@Ignore("Intermittent failures: https://github.com/mozilla-mobile/fenix/issues/10642")
@Test
fun openNewPrivateTabTest() {
homeScreen { }.dismissOnboarding()
@ -92,7 +90,7 @@ class TabbedBrowsingTest {
navigationToolbar {
}.openNewTabAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
verifyTabCounter("1")
}.openTabDrawer {
verifyExistingTabList()
@ -110,7 +108,7 @@ class TabbedBrowsingTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}.openTabDrawer {
verifyExistingTabList()
}.openTabsListThreeDotMenu {
@ -128,7 +126,7 @@ class TabbedBrowsingTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}.openTabDrawer {
verifyPrivateModeSelected()
verifyExistingTabList()
@ -149,7 +147,7 @@ class TabbedBrowsingTest {
genericURLS.forEachIndexed { index, element ->
navigationToolbar {
}.openNewTabAndEnterToBrowser(element.url) {
verifyPageContent(element.content)
// verifyPageContent(element.content)
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_${index + 1}")
verifyCloseTabsButton("Test_Page_${index + 1}")
@ -182,7 +180,7 @@ class TabbedBrowsingTest {
genericURLS.forEachIndexed { index, element ->
navigationToolbar {
}.openNewTabAndEnterToBrowser(element.url) {
verifyPageContent(element.content)
// verifyPageContent(element.content)
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_${index + 1}")
verifyCloseTabsButton("Test_Page_${index + 1}")

View File

@ -53,7 +53,7 @@ class TopSitesTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}.openThreeDotMenu {
verifyAddFirefoxHome()
}.addToFirefoxHome {
@ -72,7 +72,7 @@ class TopSitesTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}.openThreeDotMenu {
verifyAddFirefoxHome()
}.addToFirefoxHome {
@ -82,7 +82,7 @@ class TopSitesTest {
verifyExistingTopSitesList()
verifyExistingTopSitesTabs(defaultWebPageTitle)
}.openTopSiteTabWithTitle(title = defaultWebPageTitle) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
verifyUrl(defaultWebPage.url.toString().replace("http://", ""))
}.openTabDrawer {
}.openHomeScreen {
@ -103,7 +103,7 @@ class TopSitesTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}.openThreeDotMenu {
verifyAddFirefoxHome()
}.addToFirefoxHome {
@ -126,7 +126,7 @@ class TopSitesTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
// verifyPageContent(defaultWebPage.content)
}.openThreeDotMenu {
verifyAddFirefoxHome()
}.addToFirefoxHome {

View File

@ -78,11 +78,14 @@ class BrowserRobot {
/* Asserts that the text within DOM element with ID="testContent" has the given text, i.e.
* document.querySelector('#testContent').innerText == expectedText
*
* This function is not working at intended and needs a replacement.
*/
fun verifyPageContent(expectedText: String) {
val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
mDevice.waitNotNull(Until.findObject(By.textContains(expectedText)), waitingTime)
}
/* fun verifyPageContent(expectedText: String) {
// val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
// mDevice.waitNotNull(Until.findObject(By.textContains(expectedText)), waitingTime)
}*/
fun verifyTabCounter(expectedText: String) {
onView(withId(R.id.counter_text))

View File

@ -83,8 +83,6 @@ class HistoryRobot {
.click()
}
fun verifyDeleteSnackbarText(text: String) = assertSnackBarText(text)
class Transition {
fun goBack(interact: HistoryRobot.() -> Unit): Transition {
goBackButton().click()
@ -154,6 +152,3 @@ private fun assertDeleteConfirmationMessage() =
.check(matches(isDisplayed()))
private fun assertCopySnackBarText() = snackBarText().check(matches(withText("URL copied")))
private fun assertSnackBarText(text: String) =
snackBarText().check(matches(withText(Matchers.containsString(text))))

View File

@ -83,7 +83,7 @@ private fun assertAllTheCheckBoxesText() {
onView(withText(R.string.preferences_delete_browsing_data_tabs_title_2))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
onView(withText(R.string.preferences_delete_browsing_data_on_quit_browsing_history))
onView(withText(R.string.preferences_delete_browsing_data_browsing_data_title))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
onView(withText(R.string.preferences_delete_browsing_data_cookies))

View File

@ -142,6 +142,7 @@ open class FenixApplication : LocaleAwareApplication() {
}
}
prefetchForHomeFragment()
setupLeakCanary()
if (settings().isTelemetryEnabled) {
components.analytics.metrics.start(MetricServiceType.Data)
@ -228,6 +229,13 @@ open class FenixApplication : LocaleAwareApplication() {
// no-op, LeakCanary is disabled by default
}
// This is for issue https://github.com/mozilla-mobile/fenix/issues/11660. We prefetch our info for startup
// so that we're sure that we have all the data available as our fragment is launched.
private fun prefetchForHomeFragment() {
StrictMode.allowThreadDiskReads().resetPoliciesAfter {
components.core.topSiteStorage.prefetch()
}
}
private fun setupPush() {
// Sets the PushFeature as the singleton instance for push messages to go to.
// We need the push feature setup here to deliver messages in the case where the service

View File

@ -14,6 +14,7 @@ import mozilla.components.feature.top.sites.TopSite
import mozilla.components.feature.top.sites.TopSiteStorage
import mozilla.components.support.locale.LocaleManager
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.observeOnce
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.settings.advanced.getSelectedLocale
@ -86,4 +87,10 @@ class TopSiteStorage(private val context: Context) {
context.settings().defaultTopSitesAdded = true
}
}
fun prefetch() {
getTopSites().observeOnce {
cachedTopSites = it
}
}
}

View File

@ -0,0 +1,20 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.ext
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
/**
* Observe a LiveData once and unregister from it as soon as the live data returns a value
*/
fun <T> LiveData<T>.observeOnce(observer: (T) -> Unit) {
observeForever(object : Observer<T> {
override fun onChanged(value: T) {
removeObserver(this)
observer(value)
}
})
}

View File

@ -215,11 +215,10 @@ class HomeFragment : Fragment() {
sessionControlInteractor,
homeViewModel
)
activity.themeManager.applyStatusBarTheme(activity)
view.consumeFrom(homeFragmentStore, viewLifecycleOwner) {
sessionControlView?.update(it)
}
updateSessionControlView(view)
activity.themeManager.applyStatusBarTheme(activity)
view.consumeFrom(requireComponents.core.store, viewLifecycleOwner) {
val tabCount = if (currentMode.getCurrentMode() == Mode.Normal) {
@ -234,6 +233,20 @@ class HomeFragment : Fragment() {
return view
}
/**
* The [SessionControlView] is forced to update with our current state when we call
* [HomeFragment.onCreateView] in order to be able to draw everything at once with the current
* data in our store. The [View.consumeFrom] coroutine dispatch
* doesn't get run right away which means that we won't draw on the first layout pass.
*/
fun updateSessionControlView(view: View) {
sessionControlView?.update(homeFragmentStore.state)
view.consumeFrom(homeFragmentStore, viewLifecycleOwner) {
sessionControlView?.update(it)
}
}
private fun updateLayout(view: View) {
val shouldUseBottomToolbar = view.context.settings().shouldUseBottomToolbar

View File

@ -4,7 +4,6 @@
package org.mozilla.fenix.home.sessioncontrol
import android.os.Build
import android.view.View
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
@ -142,13 +141,8 @@ class SessionControlView(
}
fun update(state: HomeFragmentState) {
// Workaround for list not updating until scroll on Android 5 + 6
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
sessionControlAdapter.submitList(null)
}
val stateAdapterList = state.toAdapterList()
if (homeScreenViewModel.shouldScrollToTopSites) {
sessionControlAdapter.submitList(stateAdapterList) {

View File

@ -35,7 +35,7 @@ interface BookmarkController {
fun handleBookmarkSharing(item: BookmarkNode)
fun handleOpeningBookmark(item: BookmarkNode, mode: BrowsingMode)
fun handleBookmarkDeletion(nodes: Set<BookmarkNode>, eventType: Event)
fun handleBookmarkFolderDeletion(nodes: Set<BookmarkNode>)
fun handleBookmarkFolderDeletion(node: BookmarkNode)
fun handleBackPressed()
}
@ -45,7 +45,7 @@ class DefaultBookmarkController(
private val navController: NavController,
private val showSnackbar: (String) -> Unit,
private val deleteBookmarkNodes: (Set<BookmarkNode>, Event) -> Unit,
private val deleteBookmarkFolder: (Set<BookmarkNode>) -> Unit,
private val deleteBookmarkFolder: (BookmarkNode) -> Unit,
private val invokePendingDeletion: () -> Unit
) : BookmarkController {
@ -94,8 +94,8 @@ class DefaultBookmarkController(
deleteBookmarkNodes(nodes, eventType)
}
override fun handleBookmarkFolderDeletion(nodes: Set<BookmarkNode>) {
deleteBookmarkFolder(nodes)
override fun handleBookmarkFolderDeletion(node: BookmarkNode) {
deleteBookmarkFolder(node)
}
override fun handleBackPressed() {

View File

@ -274,17 +274,13 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan
}
private fun deleteMulti(selected: Set<BookmarkNode>, eventType: Event = Event.RemoveBookmarks) {
selected.forEach { if (it.type == BookmarkNodeType.FOLDER) {
showRemoveFolderDialog(selected)
return
} }
updatePendingBookmarksToDelete(selected)
pendingBookmarkDeletionJob = getDeleteOperation(eventType)
val message = when (eventType) {
is Event.RemoveBookmarks -> {
getRemoveBookmarksSnackBarMessage(selected, containsFolders = false)
getRemoveBookmarksSnackBarMessage(selected)
}
is Event.RemoveBookmarkFolder,
is Event.RemoveBookmark -> {
@ -305,16 +301,9 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan
)
}
private fun getRemoveBookmarksSnackBarMessage(
selected: Set<BookmarkNode>,
containsFolders: Boolean
): String {
private fun getRemoveBookmarksSnackBarMessage(selected: Set<BookmarkNode>): String {
return if (selected.size > 1) {
return if (containsFolders) {
getString(R.string.bookmark_deletion_multiple_snackbar_message_3)
} else {
getString(R.string.bookmark_deletion_multiple_snackbar_message_2)
}
getString(R.string.bookmark_deletion_multiple_snackbar_message_2)
} else {
val bookmarkNode = selected.first()
getString(
@ -325,38 +314,29 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan
}
}
private fun getDialogConfirmationMessage(selected: Set<BookmarkNode>): String {
return if (selected.size > 1) {
getString(R.string.bookmark_delete_multiple_folders_confirmation_dialog, getString(R.string.app_name))
} else {
getString(R.string.bookmark_delete_folder_confirmation_dialog)
}
}
override fun onDestroyView() {
super.onDestroyView()
_bookmarkInteractor = null
}
private fun showRemoveFolderDialog(selected: Set<BookmarkNode>) {
private fun showRemoveFolderDialog(selected: BookmarkNode) {
activity?.let { activity ->
AlertDialog.Builder(activity).apply {
val dialogConfirmationMessage = getDialogConfirmationMessage(selected)
setMessage(dialogConfirmationMessage)
setMessage(R.string.bookmark_delete_folder_confirmation_dialog)
setNegativeButton(R.string.delete_browsing_data_prompt_cancel) { dialog: DialogInterface, _ ->
dialog.cancel()
}
setPositiveButton(R.string.delete_browsing_data_prompt_allow) { dialog: DialogInterface, _ ->
updatePendingBookmarksToDelete(selected)
updatePendingBookmarksToDelete(setOf(selected))
pendingBookmarkDeletionJob = getDeleteOperation(Event.RemoveBookmarkFolder)
dialog.dismiss()
val snackbarMessage = getRemoveBookmarksSnackBarMessage(selected, containsFolders = true)
val message = getDeleteDialogString(selected)
viewLifecycleOwner.lifecycleScope.allowUndo(
requireView(),
snackbarMessage,
message,
getString(R.string.bookmark_undo_deletion),
{
undoPendingDeletion(selected)
undoPendingDeletion(setOf(selected))
},
operation = getDeleteOperation(Event.RemoveBookmarkFolder)
)
@ -373,6 +353,14 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan
bookmarkInteractor.onBookmarksChanged(bookmarkTree)
}
private fun getDeleteDialogString(selected: BookmarkNode): String {
return getString(
R.string.bookmark_deletion_snackbar_message,
context?.components?.publicSuffixList?.let { selected.url?.toShortUrl(it) }
?: selected.title
)
}
private suspend fun undoPendingDeletion(selected: Set<BookmarkNode>) {
pendingBookmarksToDelete.removeAll(selected)
pendingBookmarkDeletionJob = null

View File

@ -90,7 +90,7 @@ class BookmarkFragmentInteractor(
null -> Event.RemoveBookmarks
}
if (eventType == Event.RemoveBookmarkFolder) {
bookmarksController.handleBookmarkFolderDeletion(nodes)
bookmarksController.handleBookmarkFolderDeletion(nodes.first())
} else {
bookmarksController.handleBookmarkDeletion(nodes, eventType)
}

View File

@ -57,7 +57,6 @@ class SelectBookmarkFolderFragment : Fragment() {
.getTree(BookmarkRoot.Root.id, recursive = true)
?.let { DesktopFolders(context, showMobileRoot = true).withOptionalDesktopFolders(it) }
}
activity?.title = bookmarkNode?.title ?: getString(R.string.library_bookmarks)
val adapter = SelectBookmarkFolderAdapter(sharedViewModel)
recylerViewBookmarkFolders.adapter = adapter
adapter.updateData(bookmarkNode)

View File

@ -33,8 +33,6 @@ class HistoryAdapter(
private var mode: HistoryFragmentState.Mode = HistoryFragmentState.Mode.Normal
override val selectedItems get() = mode.selectedItems
var pendingDeletionIds = emptySet<Long>()
private val itemsWithHeaders: MutableMap<HistoryItemTimeGroup, Int> = mutableMapOf()
override fun getItemViewType(position: Int): Int = HistoryListItemViewHolder.LAYOUT_ID
@ -50,33 +48,13 @@ class HistoryAdapter(
}
override fun onBindViewHolder(holder: HistoryListItemViewHolder, position: Int) {
val previous = if (position == 0) null else getItem(position - 1)
val current = getItem(position) ?: return
val headerForCurrentItem = timeGroupForHistoryItem(current)
val isPendingDeletion = pendingDeletionIds.contains(current.visitedAt)
var timeGroup: HistoryItemTimeGroup? = null
// Add or remove the header and position to the map depending on it's deletion status
if (itemsWithHeaders.containsKey(headerForCurrentItem)) {
if (isPendingDeletion && itemsWithHeaders[headerForCurrentItem] == position) {
itemsWithHeaders.remove(headerForCurrentItem)
} else if (isPendingDeletion && itemsWithHeaders[headerForCurrentItem] != position) {
// do nothing
} else {
if (position <= itemsWithHeaders[headerForCurrentItem] as Int) {
itemsWithHeaders[headerForCurrentItem] = position
timeGroup = headerForCurrentItem
}
}
} else if (!isPendingDeletion) {
itemsWithHeaders[headerForCurrentItem] = position
timeGroup = headerForCurrentItem
}
holder.bind(current, timeGroup, position == 0, mode, isPendingDeletion)
}
fun updatePendingDeletionIds(pendingDeletionIds: Set<Long>) {
this.pendingDeletionIds = pendingDeletionIds
val previousHeader = previous?.let(::timeGroupForHistoryItem)
val currentHeader = timeGroupForHistoryItem(current)
val timeGroup = if (currentHeader != previousHeader) currentHeader else null
holder.bind(current, timeGroup, position == 0, mode)
}
companion object {

View File

@ -17,11 +17,8 @@ import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavDirections
import androidx.navigation.fragment.findNavController
import kotlinx.android.synthetic.main.fragment_history.view.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.launch
@ -34,18 +31,17 @@ import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.addons.showSnackBar
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.components.Components
import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.components.StoreProvider
import org.mozilla.fenix.components.history.createSynchronousPagedHistoryProvider
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.getStringWithArgSafe
import org.mozilla.fenix.ext.nav
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.ext.toShortUrl
import org.mozilla.fenix.library.LibraryPageFragment
import org.mozilla.fenix.utils.allowUndo
@SuppressWarnings("TooManyFunctions", "LargeClass")
class HistoryFragment : LibraryPageFragment<HistoryItem>(), UserInteractionHandler {
@ -53,8 +49,6 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), UserInteractionHandl
private lateinit var historyView: HistoryView
private lateinit var historyInteractor: HistoryInteractor
private lateinit var viewModel: HistoryViewModel
private var undoScope: CoroutineScope? = null
private var pendingHistoryDeletionJob: (suspend () -> Unit)? = null
override fun onCreateView(
inflater: LayoutInflater,
@ -65,10 +59,7 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), UserInteractionHandl
historyStore = StoreProvider.get(this) {
HistoryFragmentStore(
HistoryFragmentState(
items = listOf(),
mode = HistoryFragmentState.Mode.Normal,
pendingDeletionIds = emptySet(),
isDeletingItems = false
items = listOf(), mode = HistoryFragmentState.Mode.Normal
)
)
}
@ -120,18 +111,18 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), UserInteractionHandl
}
private fun deleteHistoryItems(items: Set<HistoryItem>) {
updatePendingHistoryToDelete(items)
undoScope = CoroutineScope(IO)
undoScope?.allowUndo(
requireView(),
getMultiSelectSnackBarMessage(items),
getString(R.string.bookmark_undo_deletion),
{
undoPendingDeletion(items)
},
getDeleteHistoryItemsOperation(items)
)
val message = getMultiSelectSnackBarMessage(items)
viewLifecycleOwner.lifecycleScope.launch {
context?.components?.run {
for (item in items) {
analytics.metrics.track(Event.HistoryItemRemoved)
core.historyStorage.deleteVisit(item.url, item.visitedAt)
}
}
viewModel.invalidate()
showSnackBar(requireView(), message)
historyStore.dispatch(HistoryFragmentAction.ExitDeletionMode)
}
}
@ExperimentalCoroutinesApi
@ -155,8 +146,8 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), UserInteractionHandl
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
val menuRes = when (historyStore.state.mode) {
HistoryFragmentState.Mode.Normal -> R.menu.library_menu
is HistoryFragmentState.Mode.Syncing -> R.menu.library_menu
is HistoryFragmentState.Mode.Editing -> R.menu.history_select_multi
else -> return
}
inflater.inflate(menuRes, menu)
@ -171,8 +162,13 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), UserInteractionHandl
true
}
R.id.delete_history_multi_select -> {
deleteHistoryItems(historyStore.state.mode.selectedItems)
historyStore.dispatch(HistoryFragmentAction.ExitEditMode)
val message = getMultiSelectSnackBarMessage(selectedItems)
viewLifecycleOwner.lifecycleScope.launch(Main) {
deleteSelectedHistory(historyStore.state.mode.selectedItems, requireComponents)
viewModel.invalidate()
historyStore.dispatch(HistoryFragmentAction.ExitDeletionMode)
showSnackBar(requireView(), message)
}
true
}
R.id.open_history_in_new_tabs_multi_select -> {
@ -181,7 +177,10 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), UserInteractionHandl
selectedItem.url
}
navigate(HistoryFragmentDirections.actionGlobalHome())
nav(
R.id.historyFragment,
HistoryFragmentDirections.actionGlobalHome()
)
true
}
R.id.open_history_in_private_tabs_multi_select -> {
@ -194,7 +193,10 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), UserInteractionHandl
browsingModeManager.mode = BrowsingMode.Private
supportActionBar?.hide()
}
navigate(HistoryFragmentDirections.actionGlobalHome())
nav(
R.id.historyFragment,
HistoryFragmentDirections.actionGlobalHome()
)
true
}
else -> super.onOptionsItemSelected(item)
@ -204,22 +206,14 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), UserInteractionHandl
return if (historyItems.size > 1) {
getString(R.string.history_delete_multiple_items_snackbar)
} else {
requireContext().getStringWithArgSafe(
getString(
R.string.history_delete_single_item_snackbar,
historyItems.first().url.toShortUrl(requireComponents.publicSuffixList)
)
}
}
override fun onPause() {
invokePendingDeletion()
super.onPause()
}
override fun onBackPressed(): Boolean {
invokePendingDeletion()
return historyView.onBackPressed()
}
override fun onBackPressed(): Boolean = historyView.onBackPressed()
private fun openItem(item: HistoryItem, mode: BrowsingMode? = null) {
requireComponents.analytics.metrics.track(Event.HistoryItemOpened)
@ -259,58 +253,23 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), UserInteractionHandl
}
}
private suspend fun deleteSelectedHistory(
selected: Set<HistoryItem>,
components: Components = requireComponents
) {
requireComponents.analytics.metrics.track(Event.HistoryItemRemoved)
val storage = components.core.historyStorage
for (item in selected) {
storage.deleteVisit(item.url, item.visitedAt)
}
}
private fun share(data: List<ShareData>) {
requireComponents.analytics.metrics.track(Event.HistoryItemShared)
val directions = HistoryFragmentDirections.actionGlobalShareFragment(
data = data.toTypedArray()
)
navigate(directions)
}
private fun navigate(directions: NavDirections) {
invokePendingDeletion()
findNavController().nav(
R.id.historyFragment,
directions
)
}
private fun getDeleteHistoryItemsOperation(items: Set<HistoryItem>): (suspend () -> Unit) {
return {
CoroutineScope(IO).launch {
historyStore.dispatch(HistoryFragmentAction.EnterDeletionMode)
context?.components?.run {
for (item in items) {
analytics.metrics.track(Event.HistoryItemRemoved)
core.historyStorage.deleteVisit(item.url, item.visitedAt)
}
}
historyStore.dispatch(HistoryFragmentAction.ExitDeletionMode)
pendingHistoryDeletionJob = null
}
}
}
private fun updatePendingHistoryToDelete(items: Set<HistoryItem>) {
pendingHistoryDeletionJob = getDeleteHistoryItemsOperation(items)
val ids = items.map { item -> item.visitedAt }.toSet()
historyStore.dispatch(HistoryFragmentAction.AddPendingDeletionSet(ids))
}
private fun undoPendingDeletion(items: Set<HistoryItem>) {
pendingHistoryDeletionJob = null
val ids = items.map { item -> item.visitedAt }.toSet()
historyStore.dispatch(HistoryFragmentAction.UndoRemovePendingDeletionSet(ids))
}
private fun invokePendingDeletion() {
pendingHistoryDeletionJob?.let {
viewLifecycleOwner.lifecycleScope.launch {
it.invoke()
}.invokeOnCompletion {
pendingHistoryDeletionJob = null
}
}
nav(R.id.historyFragment, directions)
}
private suspend fun syncHistory() {

View File

@ -30,8 +30,6 @@ sealed class HistoryFragmentAction : Action {
object ExitEditMode : HistoryFragmentAction()
data class AddItemForRemoval(val item: HistoryItem) : HistoryFragmentAction()
data class RemoveItemForRemoval(val item: HistoryItem) : HistoryFragmentAction()
data class AddPendingDeletionSet(val itemIds: Set<Long>) : HistoryFragmentAction()
data class UndoRemovePendingDeletionSet(val itemIds: Set<Long>) : HistoryFragmentAction()
object EnterDeletionMode : HistoryFragmentAction()
object ExitDeletionMode : HistoryFragmentAction()
object StartSync : HistoryFragmentAction()
@ -43,16 +41,12 @@ sealed class HistoryFragmentAction : Action {
* @property items List of HistoryItem to display
* @property mode Current Mode of History
*/
data class HistoryFragmentState(
val items: List<HistoryItem>,
val mode: Mode,
val pendingDeletionIds: Set<Long>,
val isDeletingItems: Boolean
) : State {
data class HistoryFragmentState(val items: List<HistoryItem>, val mode: Mode) : State {
sealed class Mode {
open val selectedItems = emptySet<HistoryItem>()
object Normal : Mode()
object Deleting : Mode()
object Syncing : Mode()
data class Editing(override val selectedItems: Set<HistoryItem>) : Mode()
}
@ -79,17 +73,9 @@ private fun historyStateReducer(
)
}
is HistoryFragmentAction.ExitEditMode -> state.copy(mode = HistoryFragmentState.Mode.Normal)
is HistoryFragmentAction.EnterDeletionMode -> state.copy(isDeletingItems = true)
is HistoryFragmentAction.ExitDeletionMode -> state.copy(isDeletingItems = false)
is HistoryFragmentAction.EnterDeletionMode -> state.copy(mode = HistoryFragmentState.Mode.Deleting)
is HistoryFragmentAction.ExitDeletionMode -> state.copy(mode = HistoryFragmentState.Mode.Normal)
is HistoryFragmentAction.StartSync -> state.copy(mode = HistoryFragmentState.Mode.Syncing)
is HistoryFragmentAction.FinishSync -> state.copy(mode = HistoryFragmentState.Mode.Normal)
is HistoryFragmentAction.AddPendingDeletionSet ->
state.copy(
pendingDeletionIds = state.pendingDeletionIds + action.itemIds
)
is HistoryFragmentAction.UndoRemovePendingDeletionSet ->
state.copy(
pendingDeletionIds = state.pendingDeletionIds - action.itemIds
)
}
}

View File

@ -90,6 +90,7 @@ class HistoryView(
val view: View = LayoutInflater.from(container.context)
.inflate(R.layout.component_history, container, true)
private var items: List<HistoryItem> = listOf()
var mode: HistoryFragmentState.Mode = HistoryFragmentState.Mode.Normal
private set
@ -115,16 +116,13 @@ class HistoryView(
fun update(state: HistoryFragmentState) {
val oldMode = mode
view.progress_bar.isVisible = state.isDeletingItems
view.progress_bar.isVisible = state.mode === HistoryFragmentState.Mode.Deleting
view.swipe_refresh.isRefreshing = state.mode === HistoryFragmentState.Mode.Syncing
view.swipe_refresh.isEnabled =
state.mode === HistoryFragmentState.Mode.Normal || state.mode === HistoryFragmentState.Mode.Syncing
items = state.items
mode = state.mode
historyAdapter.updatePendingDeletionIds(state.pendingDeletionIds)
updateEmptyState(state.pendingDeletionIds.size != historyAdapter.currentList?.size)
historyAdapter.updateMode(state.mode)
val first = layoutManager.findFirstVisibleItemPosition()
val last = layoutManager.findLastVisibleItemPosition() + 1

View File

@ -11,13 +11,13 @@ import kotlinx.android.synthetic.main.library_site_item.view.*
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.hideAndDisable
import org.mozilla.fenix.ext.showAndEnable
import org.mozilla.fenix.utils.Do
import org.mozilla.fenix.library.SelectionHolder
import org.mozilla.fenix.library.history.HistoryFragmentState
import org.mozilla.fenix.library.history.HistoryInteractor
import org.mozilla.fenix.library.history.HistoryItem
import org.mozilla.fenix.library.history.HistoryItemMenu
import org.mozilla.fenix.library.history.HistoryItemTimeGroup
import org.mozilla.fenix.utils.Do
class HistoryListItemViewHolder(
view: View,
@ -44,15 +44,8 @@ class HistoryListItemViewHolder(
item: HistoryItem,
timeGroup: HistoryItemTimeGroup?,
showDeleteButton: Boolean,
mode: HistoryFragmentState.Mode,
isPendingDeletion: Boolean = false
mode: HistoryFragmentState.Mode
) {
if (isPendingDeletion) {
itemView.history_layout.visibility = View.GONE
} else {
itemView.history_layout.visibility = View.VISIBLE
}
itemView.history_layout.titleView.text = item.title
itemView.history_layout.urlView.text = item.url

View File

@ -122,7 +122,7 @@ class CustomizationFragment : PreferenceFragmentCompat() {
))
}
val bottomPreference = requirePreference<RadioButtonPreference>(R.string.pref_key_toolbar_top)
val bottomPreference = requirePreference<RadioButtonPreference>(R.string.pref_key_toolbar_bottom)
bottomPreference.onClickListener {
requireContext().components.analytics.metrics.track(Event.ToolbarPositionChanged(
Event.ToolbarPositionChanged.Position.BOTTOM

View File

@ -26,28 +26,56 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.utils.Settings
@SuppressWarnings("TooManyFunctions")
class DeleteBrowsingDataFragment : Fragment(R.layout.fragment_delete_browsing_data) {
private lateinit var controller: DeleteBrowsingDataController
private var scope: CoroutineScope? = null
private lateinit var settings: Settings
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
controller = DefaultDeleteBrowsingDataController(requireContext())
settings = requireContext().settings()
getCheckboxes().forEach {
it.onCheckListener = { _ -> updateDeleteButton() }
it.onCheckListener = { _ ->
updateDeleteButton()
updatePreference(it)
}
}
getCheckboxes().forEach { it.isChecked = true }
getCheckboxes().forEach {
it.isChecked = when (it.id) {
R.id.open_tabs_item -> settings.deleteOpenTabs
R.id.browsing_data_item -> settings.deleteBrowsingHistory
R.id.cookies_item -> settings.deleteCookies
R.id.cached_files_item -> settings.deleteCache
R.id.site_permissions_item -> settings.deleteSitePermissions
else -> true
}
}
view.delete_data?.setOnClickListener {
askToDelete()
}
updateDeleteButton()
}
private fun updatePreference(it: DeleteBrowsingDataItem) {
when (it.id) {
R.id.open_tabs_item -> settings.deleteOpenTabs = it.isChecked
R.id.browsing_data_item -> settings.deleteBrowsingHistory = it.isChecked
R.id.cookies_item -> settings.deleteCookies = it.isChecked
R.id.cached_files_item -> settings.deleteCache = it.isChecked
R.id.site_permissions_item -> settings.deleteSitePermissions = it.isChecked
else -> return
}
}
@ExperimentalCoroutinesApi
@ -138,10 +166,6 @@ class DeleteBrowsingDataFragment : Fragment(R.layout.fragment_delete_browsing_da
delete_browsing_data_wrapper.isClickable = true
delete_browsing_data_wrapper.alpha = ENABLED_ALPHA
getCheckboxes().forEach {
it.isChecked = false
}
updateItemCounts()
FenixSnackbar.make(

View File

@ -441,6 +441,31 @@ class Settings private constructor(
default = false
)
var deleteOpenTabs by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_delete_open_tabs_now),
default = true
)
var deleteBrowsingHistory by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_delete_browsing_history_now),
default = true
)
var deleteCookies by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_delete_cookies_now),
default = true
)
var deleteCache by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_delete_caches_now),
default = true
)
var deleteSitePermissions by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_delete_permissions_now),
default = true
)
var shouldUseBottomToolbar by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_toolbar_bottom),
// Default accessibility users to top toolbar

View File

@ -1,5 +1,4 @@
<?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"
@ -7,12 +6,12 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginBottom="8dp"
android:background="?android:selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:gravity="center_vertical"
android:paddingStart="16dp"
android:layout_marginBottom="8dp"
android:paddingEnd="16dp">
<LinearLayout
@ -29,6 +28,7 @@
android:id="@android:id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:textColor="@color/state_list_text_color"
android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@android:id/summary"
@ -42,6 +42,7 @@
android:id="@android:id/summary"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:textColor="@color/secondary_state_list_text_color"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"

View File

@ -1,52 +0,0 @@
<?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"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingStart="8dp"
android:paddingEnd="?android:attr/scrollbarSize">
<LinearLayout
android:id="@android:id/widget_frame"
android:layout_width="48dp"
android:layout_height="0dp"
android:gravity="center_vertical"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@android:id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textColor="@color/state_list_text_color"
android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@android:id/summary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@android:id/widget_frame"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="Delete browsing data category" />
<TextView
android:id="@android:id/summary"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textColor="@color/secondary_state_list_text_color"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@android:id/widget_frame"
app:layout_constraintTop_toBottomOf="@android:id/title"
app:layout_constraintVertical_chainStyle="packed"
tools:text="Delete browsing data summary" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -27,6 +27,8 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/library_item_icon_margin_horizontal"
android:layout_marginEnd="@dimen/library_item_icon_margin_horizontal"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:clickable="false"
android:textAppearance="@style/ListItemTextStyle"
app:layout_constraintBottom_toTopOf="@id/subtitle"
@ -42,8 +44,10 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/library_item_icon_margin_horizontal"
android:layout_marginEnd="@dimen/library_item_icon_margin_horizontal"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:clickable="false"
android:textAppearance="@style/SubtitleTextStyle"
android:textColor="@color/secondary_state_list_text_color"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/checkbox"

View File

@ -37,7 +37,6 @@
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="9dp"
android:layout_marginEnd="74dp"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="@style/Body14TextStyle"

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="0dp" />

View File

@ -270,6 +270,8 @@
<string name="preferences_sync_bookmarks">Marcadores</string>
<!-- Preference for syncing logins -->
<string name="preferences_sync_logins">Anicios de sesión</string>
<!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs_2">Llingüetes abiertes</string>
<!-- Preference for signing out -->
<string name="preferences_sign_out">Zarrar sesión</string>
<!-- Preference displays and allows changing current FxA device name -->
@ -592,7 +594,9 @@
<!-- Collections header on home fragment -->
<string name="collections_header">Coleiciones</string>
<!-- No Open Tabs Message Header -->
<string name="no_collections_header1">Coleiciona les coses que t\'importa</string>
<string name="no_collections_header1">Coleiciona les coses que t\'importen</string>
<!-- Label to describe what collections are to a new user without any collections -->
<string name="no_collections_description1">Agrupa guetes, sitios y llingüetes similares p\'acceder aína a ellos dempués.</string>
<!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">Esbilla de llingüetes</string>
<!-- Title for the "select collection" step of the collection creator -->
@ -719,7 +723,7 @@
<!-- Message for copying the URL via long press on the toolbar -->
<string name="url_copied">Copióse la URL</string>
<!-- Sample text for accessibility font size -->
<string name="accessibility_text_size_sample_text_1">Esto ye un testu d\'exemplu. Ta equí p\'amosar cómo va apaecer cuando aumentes o amenorgues el tamañu con esti axuste.</string>
<string name="accessibility_text_size_sample_text_1">Esto ye un testu d\'exemplu. Ta equí p\'amosar cómo va apaecer cuando aumentes o amenorgues el so tamañu con esti axuste.</string>
<!-- Summary for Accessibility Text Size Scaling Preference -->
<string name="preference_accessibility_text_size_summary">Agranda o apequeña\'l testu de los sitios web</string>
@ -727,8 +731,15 @@
<!-- Title for Accessibility Text Size Scaling Preference -->
<string name="preference_accessibility_font_size_title">Tamañu de la fonte</string>
<!-- Title for Accessibility Text Automatic Size Scaling Preference -->
<string name="preference_accessibility_auto_size_2">Tamañu de fontes automáticu</string>
<!-- Summary for Accessibility Text Automatic Size Scaling Preference -->
<string name="preference_accessibility_auto_size_summary">El tamañu de les fontes van casar colos tos axustes d\'Android. Desactiva esta opción pa xestionar esi tamañu equí.</string>
<!-- Title for the Delete browsing data preference -->
<string name="preferences_delete_browsing_data">Desaniciu de los datos de restolar</string>
<!-- Title for the tabs item in Delete browsing data -->
<string name="preferences_delete_browsing_data_tabs_title_2">Llingüetes abiertes</string>
<!-- Subtitle for the tabs item in Delete browsing data, parameter will be replaced with the number of open tabs -->
<string name="preferences_delete_browsing_data_tabs_subtitle">%d llingüetes</string>
<!-- Title for the data and history items in Delete browsing data -->
@ -831,8 +842,19 @@
<!-- text for the tracking protection onboarding card header -->
<string name="onboarding_tracking_protection_header_2">Privacidá automática</string>
<!-- text for the tracking protection card description
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_tracking_protection_description_2">Los axustes de privacidá y seguranza bloquien rastrexadores, malware y compañes que t\'escorren.</string>
<!-- text for tracking protection radio button option for standard level of blocking -->
<string name="onboarding_tracking_protection_standard_button_2">Estándar (por defeutu)</string>
<!-- text for standard blocking option button description -->
<string name="onboarding_tracking_protection_standard_button_description_2">Bloquia dalgunos rastrexadores. Les páxines van cargar de mou normal.</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">Estricta (aconséyase)</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_option">Estricta</string>
<!-- text for strict blocking option button description -->
<string name="onboarding_tracking_protection_strict_button_description_2">Bloquia más rastrexadores, anuncios y ventanos emerxentes. Los páxines van cargar más rápido pero quiciabes dalgunes funcionalidaes nun funcionen.</string>
<!-- text for the toolbar position card header
In English this is an idiom for "choose a side as in an argument or fight"
but it is ok to make this more literally about "choosing a position in a physical space -->
@ -915,10 +937,16 @@
<string name="preference_enhanced_tracking_protection_explanation">Curia los tos datos. %s protéxite de la mayoría de rastrexadores comunes que siguen lo que faes en llinia.</string>
<!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">Deprender más</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_default_1">Estándar (por defeutu)</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description_3">Bloquia dalgunos rastrexadores. Les páxines van cargar de mou normal.</string>
<!-- Accessibility text for the Standard protection information icon -->
<string name="preference_enhanced_tracking_protection_standard_info_button">Qué se bloquia coles proteición estándar escontra\'l rastrexu</string>
<!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">Estricta</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_description_2">Bloquia más rastrexadores, anuncios y ventanos emerxentes. Les páxines van cargar más rápido pero quiciabes dalgunes funcionalidaes nun funcionen.</string>
<!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_strict_info_button">Lo que la proteición estricta escontra\'l rastrexu bloquia</string>
<!-- Preference for enhanced tracking protection for the custom protection settings -->
@ -972,6 +1000,8 @@
<string name="etp_tracking_content_title">Conteníu que rastrexa</string>
<!-- Description of tracking content that can be blocked by Enhanced Tracking Protection -->
<string name="etp_tracking_content_description">Para la carga d\'anuncios, vídeos y otru conteníu esternu que contenga códigu que rastrexe. Quiciabes afeute a la funcionalidá de dalgunos sitios web.</string>
<!-- Enhanced Tracking Protection Onboarding Message shown in a dialog above the toolbar. The first parameter is the name of the application (For example: Fenix) -->
<string name="etp_onboarding_cfr_message">Cada vegada que l\'escudu tea moráu indica que %s bloquió rastrexadores nun sitiu. Tócalu pa más información.</string>
<!-- Enhanced Tracking Protection message that protection is currently on for this site -->
<string name="etp_panel_on">ACTIVÓSE nesti sitiu</string>
<!-- Enhanced Tracking Protection message that protection is currently off for this site -->
@ -1242,6 +1272,11 @@
<!-- Text displayed when user has no tabs that have been synced -->
<string name="synced_tabs_no_tabs">Nun tienes llingüetes abiertes nel Firefox de los demás preseos de to.</string>
<!-- Top Sites -->
<!-- Title text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_title">Algamóse la llende de sitios destacaos</string>
<!-- Content description text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_content">P\'amestar sitios nuevos, desanicia dalgún. Ten primíu un sitiu y esbilla Desaniciar.</string>
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Val, entendílo</string>

View File

@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Увядзіце запыт або адрас</string>
<!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Выдаліць сеанс</string>
@ -43,6 +46,10 @@
<string name="browser_menu_settings">Налады</string>
<!-- Browser menu button that opens a user's library -->
<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. -->
<string name="browser_menu_add_to_homescreen">Дадаць на хатні экран</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">Усталяваць</string>
<!-- Menu option on the toolbar that takes you to synced tabs page-->
@ -380,6 +387,8 @@
<string name="collection_menu_button_content_description">Меню калекцыі</string>
<!-- No Open Tabs Message Header -->
<string name="no_collections_header1">Збірайце важныя для вас рэчы</string>
<!-- Label to describe what collections are to a new user without any collections -->
<string name="no_collections_description1">Групуйце падобныя пошукі, сайты і карткі для хуткага доступу.</string>
<!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">Выберыце карткі</string>
<!-- Title for the "select collection" step of the collection creator -->
@ -486,4 +495,9 @@
<!-- Add button text for the Add to Homescreen dialog -->
<string name="add_to_homescreen_add">Дадаць</string>
<!-- Content description (not visible, for screen readers etc.): Title for the button to add a search engine in the action bar -->
<string name="search_engine_add_button_content_description">Дадаць</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>
</resources>

View File

@ -31,9 +31,17 @@
<!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Obriši sesiju</string>
<!-- Private mode shortcut "contextual feature recommendation" (CFR) -->
<!-- Text for the main message -->
<string name="cfr_message">Dodajte prečicu za otvaranje privatnih tabova sa Početnog ekrana.</string>
<!-- Text for the positive button -->
<string name="cfr_pos_button_text">Dodaj prečicu</string>
<!-- Text for the negative button -->
<string name="cfr_neg_button_text">Ne, hvala</string>
<!-- Search widget "contextual feature recommendation" (CFR) -->
<!-- Text for the main message. 'Firefox' intentionally hardcoded here.-->
<string name="search_widget_cfr_message">Brže dođite do Firefoxa. Dodajte widget na svoj Početni ekran.</string>
<!-- Text for the positive button -->
<string name="search_widget_cfr_pos_button_text">Dodaj widget</string>
<!-- Text for the negative button -->
@ -45,6 +53,9 @@
<!-- Shortcut action to open new private tab -->
<string name="home_screen_shortcut_open_new_private_tab_2">Novi privatni tab</string>
<!-- Browser Fragment -->
<!-- Content description (not visible, for screen readers etc.): Navigate to open tabs -->
<string name="browser_tabs_button">Otvoreni tabovi</string>
<!-- Content description (not visible, for screen readers etc.): Navigate backward (browsing history) -->
<string name="browser_menu_back">Nazad</string>
<!-- Content description (not visible, for screen readers etc.): Navigate forward (browsing history) -->
@ -121,6 +132,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Skeniraj</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Prečice</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">Postavke pretraživača</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
@ -133,6 +146,10 @@
<string name="search_suggestions_onboarding_allow_button">Dozvoli</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">Ne dozvoli</string>
<!-- Search suggestion onboarding hint title text -->
<string name="search_suggestions_onboarding_title">Dozvoliti prijedloge za pretraživanje u privatnim sesijama?</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 će podijeliti sve što unesete u adresnu traku sa vašim glavnim pretraživačem.</string>
<!-- Search suggestion onboarding hint Learn more link text -->
<string name="search_suggestions_onboarding_learn_more_link">Saznajte više</string>
@ -164,6 +181,8 @@
<!-- Preference link to rating Fenix on the Play Store -->
<string name="preferences_rate">Ocijenite na Google Play</string>
<!-- Preference for giving feedback about Fenix -->
<string name="preferences_feedback">Pošalji povratnu info.</string>
<!-- Preference linking to about page for Fenix
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="preferences_about">O %1$s</string>
@ -181,12 +200,22 @@
<string name="preferences_category_privacy">Privatnost</string>
<!-- Preference category for privacy and security settings -->
<string name="preferences_category_privacy_security">Privatnost i sigurnost</string>
<!-- Preference for advanced site permissions -->
<string name="preferences_site_permissions">Dozvole stranice</string>
<!-- Preference for private browsing options -->
<string name="preferences_private_browsing_options">Privatno surfanje</string>
<!-- Preference for opening links in a private tab-->
<string name="preferences_open_links_in_a_private_tab">Otvaraj linkove u privatnom tabu</string>
<!-- Preference for allowing screenshots to be taken while in a private tab-->
<string name="preferences_allow_screenshots_in_private_mode">Dozvoli screenshote u privatnom surfanju</string>
<!-- Preference for adding private browsing shortcut -->
<string name="preferences_add_private_browsing_shortcut">Dodaj prečicu za privatno surfanje</string>
<!-- Preference to override the Firefox Account server -->
<string name="preferences_override_fxa_server">Zaseban Firefox Account server</string>
<!-- Preference to override the Sync token server -->
<string name="preferences_override_sync_tokenserver">Zaseban 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 promijenjen. Ugasite aplikaciju za primjenu promjena…</string>
<!-- Preference category for account information -->
<string name="preferences_category_account">Račun</string>
<!-- Preference shown on banner to sign into account -->
@ -197,13 +226,46 @@
<string name="preferences_theme">Tema</string>
<!-- Preference for settings related to visual options -->
<string name="preferences_customize">Prilagodi</string>
<!-- Preference description for banner about signing in -->
<string name="preferences_sign_in_description">Sinhronizujte zabilješke, historiju i više od toga s vašim Firefox računom</string>
<!-- Preference shown instead of account display name while account profile information isn't available yet. -->
<string name="preferences_account_default_name">Firefox račun</string>
<!-- Preference for language -->
<string name="preferences_language">Jezik</string>
<!-- Preference for data choices -->
<string name="preferences_data_choices">Izbori podataka</string>
<!-- Preference for data collection -->
<string name="preferences_data_collection">Kolekcije podataka</string>
<!-- Preference linking to the privacy notice -->
<string name="preferences_privacy_link">Pravila privatnosti</string>
<!-- Preference category for developer tools -->
<string name="developer_tools_category">Razvojni alati</string>
<!-- Preference for developers -->
<string name="preferences_remote_debugging">Udaljeno debagiranje preko USB-a</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Prikaži prečice za pretraživanje</string>
<!-- Preference title for switch preference to show search suggestions -->
<string name="preferences_show_search_suggestions">Prikaži prijedloge za pretraživanje</string>
<!-- Preference title for switch preference to show voice search button -->
<string name="preferences_show_voice_search">Prikaži glasovno pretraživanje</string>
<!-- Preference title for switch preference to show search suggestions also in private mode -->
<string name="preferences_show_search_suggestions_in_private">Prikaži u privatnim sesijama</string>
<!-- Preference title for switch preference to show a clipboard suggestion when searching -->
<string name="preferences_show_clipboard_suggestions">Prikaži clipboard prijedloge</string>
<!-- Preference title for switch preference to suggest browsing history when searching -->
<string name="preferences_search_browsing_history">Pretraži historiju surfanja</string>
<!-- Preference title for switch preference to suggest bookmarks when searching -->
<string name="preferences_search_bookmarks">Pretraži zabilješke</string>
<!-- Preference for account settings -->
<string name="preferences_account_settings">Postavke računa</string>
<!-- Preference for open links in third party apps -->
<string name="preferences_open_links_in_apps">Otvori linkove u aplikacijama</string>
<!-- Preference for add_ons -->
<string name="preferences_addons">Add-oni</string>
<!-- Account Preferences -->
<!-- Preference for triggering sync -->
<string name="preferences_sync_now">Sinhr. odmah</string>
<!-- Preference category for sync -->
<string name="preferences_sync_category">Izaberite šta ćete sinhronizovati</string>
<!-- Preference for syncing history -->
@ -239,6 +301,12 @@
<!-- 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">Primljeni tabovi</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">Obavještenja za tabove primljene od drugih Firefox uređaja.</string>
<!-- The body for these is the URL of the tab received -->
<string name="fxa_tab_received_notification_name">Tab primljen</string>
<!-- When multiple tabs have been received -->
<string name="fxa_tabs_received_notification_name">Tabovi primljeni</string>
<!-- %s is the device name -->
<string name="fxa_tab_received_from_notification_name">Tab iz %s</string>
@ -261,14 +329,23 @@
<!-- 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">Saznajte više</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">Globalno isključeno, možete uključiti u Postavkama.</string>
<!-- Preference switch for Telemetry -->
<string name="preferences_telemetry">Telemetrija</string>
<!-- Preference switch for usage and technical data collection -->
<string name="preference_usage_data">Tehnički i podaci o upotrebi</string>
<!-- Preference description for usage and technical data collection -->
<string name="preferences_usage_data_description">Šalje podatke Mozilli o performansama, upotrebi, hardveru i prilagođenjima vašeg browsera kako bi nam pomogli da poboljšamo %1$s</string>
<!-- Preference switch for marketing data collection -->
<string name="preferences_marketing_data">Marketinški podaci</string>
<!-- Preference description for marketing data collection, parameter is the app name (e.g. Firefox) -->
<string name="preferences_marketing_data_description">Šalje podatke Leanplumu, našem mobile marketing vendoru, o opcijama koje koristite u %1$s</string>
<!-- Title for experiments preferences -->
<string name="preference_experiments">Eksperimenti</string>
<!-- Summary for experiments preferences -->
<string name="preference_experiments_summary">Dozvoljava Mozilli da instalira i prikuplja podatke o eksperimentalnim opcijama</string>
<!-- Preference switch for Mozilla location service -->
<string name="preferences_mozilla_location_service">Mozilla lokacijski servis</string>
<!-- Preference switch for app health report. The first parameter is the name of the application (For example: Fenix) -->
@ -326,6 +403,10 @@
<!-- Option in Library to open History page -->
<string name="library_history">Historija</string>
<!-- Option in Library to open Synced Tabs page -->
<string name="library_synced_tabs">Sinhronizovani tabovi</string>
<!-- Option in Library to open Reading List -->
<string name="library_reading_list">Lista za čitanje</string>
<!-- Menu Item Label for Search in Library -->
<string name="library_search">Traži</string>
<!-- Settings Page Title -->
@ -723,4 +804,344 @@
<!-- Title for the Delete browsing data on quit preference -->
<string name="preferences_delete_browsing_data_on_quit">Obriši podatke surfanja pri izlazu</string>
</resources>
<!-- Category for history items to delete on quit in delete browsing data on quit -->
<string name="preferences_delete_browsing_data_on_quit_browsing_history">Historija surfanja</string>
<!-- Action item in menu for the Delete browsing data on quit feature -->
<string name="delete_browsing_data_on_quit_action">Ugasi</string>
<!-- Dialog message to the user asking to delete browsing data. -->
<string name="delete_browsing_data_prompt_message">Ovo će obrisati sve vaše podatke surfanja.</string>
<!-- Dialog message to the user asking to delete browsing data. Parameter will be replaced by app name. -->
<string name="delete_browsing_data_prompt_message_3">%s će obrisati izabrane podatke surfanja.</string>
<!-- Text for the cancel button for the data deletion dialog -->
<string name="delete_browsing_data_prompt_cancel">Otkaži</string>
<!-- Text for the allow button for the data deletion dialog -->
<string name="delete_browsing_data_prompt_allow">Obriši</string>
<!-- Text for the snackbar confirmation that the data was deleted -->
<string name="preferences_delete_browsing_data_snackbar">Podaci surfanja izbrisani</string>
<!-- Text for the snackbar to show the user that the deletion of browsing data is in progress -->
<string name="deleting_browsing_data_in_progress">Brišem podatke surfanja…</string>
<!-- Tips -->
<!-- text for firefox preview moving tip header "Firefox Preview" and "Firefox Nightly" are intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header">Firefox Preview je sada Firefox Nightly</string>
<!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description">Firefox Nightly se ažurira svake noći i sadrži eksperimentalne opcije.
Međutim, može biti manje stabilan. Za više stabilnosti, preuzmite naš beta browser.</string>
<!-- text for firefox preview moving tip button. "Firefox for Android Beta" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_button_2">Preuzmi Firefox za Android Beta</string>
<!-- Onboarding -->
<!-- Text for onboarding welcome message
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_header">Dobrodošli u %s!</string>
<!-- text for the Firefox Accounts section header -->
<string name="onboarding_fxa_section_header">Već imate račun?</string>
<!-- text for the Firefox Preview feature section header
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_feature_section_header">Upoznajte %s</string>
<!-- text for the "What's New" onboarding card header -->
<string name="onboarding_whats_new_header1">Pogledajte šta je novo</string>
<!-- text for the button to confirm automatic sign-in -->
<string name="onboarding_firefox_account_auto_signin_confirm">Da, prijavi me</string>
<!-- text for the automatic sign-in button while signing in is in process -->
<string name="onboarding_firefox_account_signing_in">Prijava…</string>
<!-- text for the button to manually sign into Firefox account. The word "Firefox" should not be translated -->
<string name="onboarding_firefox_account_sign_in">Prijava u Firefox</string>
<!-- text for the button to stay signed out when presented with an option to automatically sign-in. -->
<string name="onboarding_firefox_account_stay_signed_out">Ostanite odjavljeni</string>
<!-- text for the tracking protection onboarding card header -->
<string name="onboarding_tracking_protection_header_2">Automatska privatnost</string>
<!-- text for the private browsing onboarding card header -->
<string name="onboarding_private_browsing_header">Surfajte privatno</string>
<!-- text for the private browsing onboarding card description
The first parameter is an icon that represents private browsing -->
<string name="onboarding_private_browsing_description1">Otvorite privatni tab jednom: dodirnite %s ikonicu.</string>
<!-- text for the private browsing onboarding card description, explaining how to always using private browsing -->
<string name="onboarding_private_browsing_always_description">Otvorite privatni tab svaki put: ažurirajte postavke privatnog surfanja.</string>
<!-- text for the private browsing onbording card button, that launches settings -->
<string name="onboarding_private_browsing_button">Otvori postavke</string>
<!-- text for the privacy notice onboarding card header -->
<string name="onboarding_privacy_notice_header">Vaša privatnost</string>
<!-- text for the privacy notice onboarding card description
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_privacy_notice_description">%s smo dizajnirali da vam pruži kontrolu nad onim što dijelite
online i što dijelite s nama.</string>
<!-- Text for the button to read the privacy notice -->
<string name="onboarding_privacy_notice_read_button">Pročitajte naša pravila privatnosti</string>
<!-- Content description (not visible, for screen readers etc.): Close onboarding screen -->
<string name="onboarding_close">Zatvori</string>
<!-- text for the button to finish onboarding -->
<string name="onboarding_finish">Započni surfanje</string>
<!-- Onboarding theme -->
<!-- text for the theme picker onboarding card header -->
<string name="onboarding_theme_picker_header">Izaberite vašu temu</string>
<!-- text for the theme picker onboarding card description -->
<string name="onboarding_theme_picker_description1">Štedite bateriju i vid omogućavanjem tamnog režima.</string>
<!-- Automatic theme setting (will follow device setting) -->
<string name="onboarding_theme_automatic_title">Automatski</string>
<!-- Summary of automatic theme setting (will follow device setting) -->
<string name="onboarding_theme_automatic_summary">Prilagođava se postavkama vašeg uređaja</string>
<!-- Theme setting for dark mode -->
<string name="onboarding_theme_dark_title">Tamna tema</string>
<!-- Theme setting for light mode -->
<string name="onboarding_theme_light_title">Svijetla tema</string>
<!-- Text shown in snackbar when multiple tabs have been sent to device -->
<string name="sync_sent_tabs_snackbar">Tabovi poslani!</string>
<!-- Text shown in snackbar when one tab has been sent to device -->
<string name="sync_sent_tab_snackbar">Tab poslan!</string>
<!-- Text shown in snackbar when sharing tabs failed -->
<string name="sync_sent_tab_error_snackbar">Ne mogu poslati</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">PONOVI</string>
<!-- Title of QR Pairing Fragment -->
<string name="sync_scan_code">Skenirajte kod</string>
<!-- Instructions on how to access pairing -->
<string name="sign_in_instructions"><![CDATA[Otvorite Firefox na vašem računaru i posjetite <b>https://firefox.com/pair</b>]]></string>
<!-- Text shown for sign in pairing when ready -->
<string name="sign_in_ready_for_scan">Spreman za skeniranje</string>
<!-- Text shown for settings option for sign with pairing -->
<string name="sign_in_with_camera">Prijavite se pomoću kamere</string>
<!-- Text shown for settings option for sign with email -->
<string name="sign_in_with_email">Radije koristi email</string>
<!-- Text shown in confirmation dialog to sign out of account -->
<string name="sign_out_confirmation_message">Firefox će zaustaviti sinhronizaciju s vašim računom, ali neće obrisati ništa od vaših podataka surfanja na ovom uređaju.</string>
<!-- Text shown in confirmation dialog to sign out of account. The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="sign_out_confirmation_message_2">%s će zaustaviti sinhronizaciju s vašim računom, ali neće obrisati ništa od vaših podataka surfanja na ovom uređaju.</string>
<!-- Option to cancel signing out shown in confirmation dialog to sign out of account -->
<string name="sign_out_cancel">Otkaži</string>
<!-- Enhanced Tracking Protection -->
<!-- Link displayed in enhanced tracking protection panel to access tracking protection settings -->
<string name="etp_settings">Postavke zaštite</string>
<!-- Preference title for enhanced tracking protection settings -->
<string name="preference_enhanced_tracking_protection">Napredna zaštita od praćenja</string>
<!-- Title for the description of enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_title">Surfajte bez da vas prate</string>
<!-- Description of enhanced tracking protection. The first parameter is the name of the application (For example: Fenix) -->
<string name="preference_enhanced_tracking_protection_explanation">Zadržite podatke za sebe. %s vas štiti od većine najčešćih pratilaca koji prate ono što radite online.</string>
<!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">Saznajte više</string>
<!-- Enhanced Tracking Protection message that protection is currently on for this site -->
<string name="etp_panel_on">Zaštite za ovu stranicu su UKLJUČENE</string>
<!-- Enhanced Tracking Protection message that protection is currently off for this site -->
<string name="etp_panel_off">Zaštite za ovu stranicu su ISKLJUČENE</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Napredna zaštita od praćenja je isključena za ove stranice</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Vrati me nazad</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Vaša prava</string>
<!-- About page link text to open open source licenses screen -->
<string name="about_open_source_licenses">Open source biblioteke koje koristimo</string>
<!-- About page link text to open what's new link -->
<string name="about_whats_new">Šta je novo u %s</string>
<!-- Open source licenses page title
The first parameter is the app name -->
<string name="open_source_licenses_title">%s | OSS biblioteke</string>
<!-- About page link text to open support link -->
<string name="about_support">Podrška</string>
<!-- About page link text to list of past crashes (like about:crashes on desktop) -->
<string name="about_crashes">Rušenja</string>
<!-- About page link text to open privacy notice link -->
<string name="about_privacy_notice">Pravila privatnosti</string>
<!-- About page link text to open know your rights link -->
<string name="about_know_your_rights">Znajte vaša prava</string>
<!-- About page link text to open licensing information link -->
<string name="about_licensing_information">Informacije o licenciranju</string>
<!-- About page link text to open a screen with libraries that are used -->
<string name="about_other_open_source_libraries">Biblioteke koje koristimo</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>
<!-- Content description of the tab counter toolbar button when multiple tabs are open. First parameter will be replaced with the number of tabs (always more than one) -->
<string name="tab_counter_content_description_multi_tab">%d tabova</string>
<!-- Browser long press popup menu -->
<!-- Copy the current url -->
<string name="browser_toolbar_long_press_popup_copy">Kopiraj</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">Zalijepi i otvori</string>
<!-- Paste the text in the clipboard -->
<string name="browser_toolbar_long_press_popup_paste">Zalijepi</string>
<!-- Snackbar message shown after an URL has been copied to clipboard. -->
<string name="browser_toolbar_url_copied_to_clipboard_snackbar">URL kopiran u clipboard</string>
<!-- Title text for the Add To Homescreen dialog -->
<string name="add_to_homescreen_title">Dodaj na Početni ekran</string>
<!-- Cancel button text for the Add to Homescreen dialog -->
<string name="add_to_homescreen_cancel">Otkaži</string>
<!-- Add button text for the Add to Homescreen dialog -->
<string name="add_to_homescreen_add">Dodaj</string>
<!-- Continue to website button text for the first-time Add to Homescreen dialog -->
<string name="add_to_homescreen_continue">Nastavi na web stranicu</string>
<!-- Placeholder text for the TextView in the Add to Homescreen dialog -->
<string name="add_to_homescreen_text_placeholder">Naziv prečice</string>
<!-- Describes the add to homescreen functionality -->
<string name="add_to_homescreen_description">Ovu web stranicu možete lahko dodati na Početni ekran telefona za brz pristup istoj i da surfate brže s iskustvom sličnom aplikaciji.</string>
<!-- Preference for managing the settings for logins and passwords in Fenix -->
<string name="preferences_passwords_logins_and_passwords">Prijave i lozinke</string>
<!-- Preference for managing the saving of logins and passwords in Fenix -->
<string name="preferences_passwords_save_logins">Spašene prijave i lozinke</string>
<!-- Preference option for asking to save passwords in Fenix -->
<string name="preferences_passwords_save_logins_ask_to_save">Pitaj za spašavanje</string>
<!-- Preference option for never saving passwords in Fenix -->
<string name="preferences_passwords_save_logins_never_save">Ne spašavaj nikad</string>
<!-- Preference for autofilling saved logins in Fenix -->
<string name="preferences_passwords_autofill">Auto. unos</string>
<!-- Preference for syncing saved logins in Fenix -->
<string name="preferences_passwords_sync_logins">Sinkroniziraj prijave</string>
<!-- Syncing saved logins in Fenix is on -->
<string name="preferences_passwords_sync_logins_on">Uklj</string>
<!-- Syncing saved logins in Fenix is off -->
<string name="preferences_passwords_sync_logins_off">Isklj</string>
<!-- Syncing saved logins in Fenix needs login -->
<string name="preferences_passwords_sync_logins_sign_in">Prijavite se na Sync</string>
<!-- Preference to access list of saved logins -->
<string name="preferences_passwords_saved_logins">Spašene prijave</string>
<!-- Preference to access list of saved logins -->
<string name="preferences_passwords_saved_logins_description_empty_learn_more_link">Saznajte više o Syncu.</string>
<!-- Preference to access list of login exceptions that we never save logins for -->
<string name="preferences_passwords_exceptions">Izuzeci</string>
<!-- Empty description of list of login exceptions that we never save logins for -->
<string name="preferences_passwords_exceptions_description_empty">Prijave i lozinke koje nisu spašene će biti prikazane ovdje.</string>
<!-- Description of list of login exceptions that we never save logins for -->
<string name="preferences_passwords_exceptions_description">Prijave i lozinke neće biti spašene za ove web stranice.</string>
<!-- Hint for search box in logins list -->
<string name="preferences_passwords_saved_logins_search">Pretraži prijave</string>
<!-- Option to sort logins list A-Z, alphabetically -->
<string name="preferences_passwords_saved_logins_alphabetically">Po abecedi</string>
<!-- Option to sort logins list by most recently used -->
<string name="preferences_passwords_saved_logins_recently_used">Nedavno korišteno</string>
<!-- The header for the site that a login is for -->
<string name="preferences_passwords_saved_logins_site">Stranica</string>
<!-- The header for the username for a login -->
<string name="preferences_passwords_saved_logins_username">Korisničko ime</string>
<!-- The header for the password for a login -->
<string name="preferences_passwords_saved_logins_password">Lozinka</string>
<!-- Message displayed in security prompt to reenter a secret pin to access saved logins -->
<string name="preferences_passwords_saved_logins_enter_pin">Ponovo unesite PIN</string>
<!-- Message displayed in security prompt to access saved logins -->
<string name="preferences_passwords_saved_logins_enter_pin_description">Otključajte za pregled spašenih prijava</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">Saznajte više</string>
<!-- Prompt message displayed when Fenix detects a user has entered a password and user decides if Fenix should save it. The first parameter is the name of the application (For example: Fenix) -->
<string name="logins_doorhanger_save">Da li želite da %s spasi ovu prijavu?</string>
<!-- Positive confirmation that Fenix should save the new or updated login -->
<string name="logins_doorhanger_save_confirmation">Spasi</string>
<!-- Negative confirmation that Fenix should not save the new or updated login -->
<string name="logins_doorhanger_save_dont_save">Nemoj spasiti</string>
<!-- Shown in snackbar to tell user that the password has been copied -->
<string name="logins_password_copied">Lozinka kopirana u clipboard</string>
<!-- Shown in snackbar to tell user that the username has been copied -->
<string name="logins_username_copied">Korisničko ime kopirano u clipboard</string>
<!-- Shown in snackbar to tell user that the site has been copied -->
<string name="logins_site_copied">Stranica kopirana u clipboard</string>
<!-- Content Description (for screenreaders etc) read for the button to copy a password in logins-->
<string name="saved_logins_copy_password">Kopiraj lozinku</string>
<!-- Content Description (for screenreaders etc) read for the button to copy a username in logins -->
<string name="saved_login_copy_username">Kopiraj korisničko ime</string>
<!-- Content Description (for screenreaders etc) read for the button to copy a site in logins -->
<string name="saved_login_copy_site">Kopiraj stranicu</string>
<!-- Content Description (for screenreaders etc) read for the button to reveal a password in logins -->
<string name="saved_login_reveal_password">Prikaži lozinku</string>
<!-- Content Description (for screenreaders etc) read for the button to hide a password in logins -->
<string name="saved_login_hide_password">Sakrij lozinku</string>
<!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins -->
<string name="logins_biometric_prompt_message">Otključajte za pregled spašenih prijava</string>
<!-- Title of warning dialog if users have no device authentication set up -->
<string name="logins_warning_dialog_title">Osigurajte svoje prijave i lozinke</string>
<!-- Message of warning dialog if users have no device authentication set up -->
<string name="logins_warning_dialog_message">Podesite pattern za zaključavanje uređaja, PIN ili lozinku da zaštitite vaše spašene prijave i lozinke od pristupa druge osobe koja ima vaš uređaj.</string>
<!-- Negative button to ignore warning dialog if users have no device authentication set up -->
<string name="logins_warning_dialog_later">Kasnije</string>
<!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up -->
<string name="logins_warning_dialog_set_up_now">Podesi odmah</string>
<!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their logins -->
<string name="logins_biometric_prompt_message_pin">Otključajte svoj uređaj</string>
<!-- Saved logins sorting strategy menu item -by name- (if selected, it will sort saved logins alphabetically) -->
<string name="saved_logins_sort_strategy_alphabetically">Naziv (A-Ž)</string>
<!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) -->
<string name="saved_logins_sort_strategy_last_used">Zadnja upotreba</string>
<!-- Title of the Add search engine screen -->
<string name="search_engine_add_custom_search_engine_title">Dodaj pretraživač</string>
<!-- Title of the Edit search engine screen -->
<string name="search_engine_edit_custom_search_engine_title">Uredi pretraživač</string>
<!-- Content description (not visible, for screen readers etc.): Title for the button to add a search engine in the action bar -->
<string name="search_engine_add_button_content_description">Dodaj</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">Spasi</string>
<!-- Text for the menu button to edit a search engine -->
<string name="search_engine_edit">Uredi</string>
<!-- Text for the menu button to delete a search engine -->
<string name="search_engine_delete">Obriši</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">Ostalo</string>
<!-- Placeholder text shown in the Search Engine Name TextField before a user enters text -->
<string name="search_add_custom_engine_name_hint">Naziv</string>
<!-- Description text for the Search String TextField. The %s is part of the string -->
<string name="search_add_custom_engine_search_string_example">Zamijenite izraz sa “%s”. Primjer:\nhttps://www.google.ba/search?q=%s</string>
<!-- Text for the button to learn more about adding a custom search engine -->
<string name="search_add_custom_engine_learn_more_label">Saznajte više</string>
<!-- Text shown when a user leaves the name field empty -->
<string name="search_add_custom_engine_error_empty_name">Unesite naziv pretraživača</string>
<!-- Text shown when a user tries to add a search engine that already exists -->
<string name="search_add_custom_engine_error_existing_name">Pretraživač s nazivom “%s” već postoji.</string>
<!-- Text shown when a user leaves the search string field empty -->
<string name="search_add_custom_engine_error_empty_search_string">Unesite pojam za pretragu</string>
<!-- Text shown when a user leaves out the required template string -->
<string name="search_add_custom_engine_error_missing_template">Provjerite da li pojam odgovara formatu primjera</string>
<!-- Text shown when we aren't able to validate the custom search query. The first parameter is the url of the custom search engine -->
<string name="search_add_custom_engine_error_cannot_reach">Greška u povezivanju na “%s”</string>
<!-- Text shown when a user creates a new search engine -->
<string name="search_add_custom_engine_success_message">Kreirano %s</string>
<!-- Text shown when a user successfully edits a custom search engine -->
<string name="search_edit_custom_engine_success_message">Spašeno %s</string>
<!-- Text shown when a user successfully deletes a custom search engine -->
<string name="search_delete_search_engine_success_message">Obrisano %s</string>
<!-- Title text shown for the migration screen to the new browser. Placeholder replaced with app name -->
<string name="migration_title">Dobrodošli u potpuno novi %s</string>
<!-- Text on the disabled button while in progress. Placeholder replaced with app name -->
<string name="migration_updating_app_button_text">Nadograđujem %s…</string>
<!-- Text on the enabled button. Placeholder replaced with app name-->
<string name="migration_update_app_button">Pokreni %s</string>
<!-- Accessibility description text for a completed migration item -->
<string name="migration_icon_description">Migracija završena</string>
<!--Text on list of migrated items (e.g. Settings, History, etc.)-->
<string name="migration_text_passwords">Lozinke</string>
<!-- Login overflow menu delete button -->
<string name="login_menu_delete_button">Obriši</string>
<!-- Login overflow menu edit button -->
<string name="login_menu_edit_button">Uredi</string>
<!-- Message in delete confirmation dialog for logins -->
<string name="login_deletion_confirmation">Da li ste sigurni da želite obrisati ovu prijavu?</string>
<!-- Positive action of a dialog asking to delete -->
<string name="dialog_delete_positive">Obriši</string>
<!-- The saved login options menu description. -->
<string name="login_options_menu">Opcije prijave</string>
<!-- The button description to save changes to an edited login. -->
<string name="save_changes_to_login">Spasite izmjene za prijavu.</string>
<!-- The button description to discard changes to an edited login. -->
<string name="discard_changes">Odbaci izmjene</string>
<!-- The page title for editing a saved login. -->
<string name="edit">Uredi</string>
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">OK, razumijem</string>
</resources>

View File

@ -14,14 +14,17 @@
<string name="content_description_disable_private_browsing_button">Deaktiviraj privatno pregledavanje</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Traži ili upiši adresu</string>
<!-- No Open Tabs Message Header -->
<string name="no_open_tabs_header_2">Nema otvorenih kartica</string>
<!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">Ovdje će se prikazati tvoje otvorene kartice.</string>
<!-- No Private Tabs Message Description -->
<string name="no_private_tabs_description">Ovdje će se prikazati tvoje privatne kartice.</string>
<!-- Message announced to the user when tab tray is selected with 1 tab -->
<string name="open_tab_tray_single">1 otvorena kartica. Dodirni za prebacivanje kartica.</string>
<!-- Message announced to the user when tab tray is selected with 0 or 2+ tabs -->
<string name="open_tab_tray_plural">%1$s otvorene kartice. Dodirni za prebacivanje kartica.</string>
<!-- About content. The first parameter is the name of the application. (For example: Fenix) -->
<string name="about_content">%1$s proizvodi Mozilla.</string>
@ -103,8 +106,6 @@
<string name="browser_menu_new_tab">Nova kartica</string>
<!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">Spremi u zbirku</string>
<!-- Browser menu button that opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">Prijavi problem sa stranicom</string>
<!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">Dijeli</string>
<!-- Share menu title, displayed when a user is sharing their current site -->
@ -118,8 +119,10 @@
<!-- 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">Omogućuje %1$s</string>
<!-- Browser menu button to put the the current page in reader mode -->
<!-- Browser menu button to put the current page in reader mode -->
<string name="browser_menu_read">Prikaz za čitanje</string>
<!-- Browser menu button content description to close reader mode and return the user to the regular browser -->
<string name="browser_menu_read_close">Zatvori pogled čitača</string>
<!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">Otvori u aplikaciji</string>
<!-- Browser menu button to configure reader mode appearance e.g. the used font type and size -->
@ -292,7 +295,7 @@
<!-- Preference for syncing logins -->
<string name="preferences_sync_logins">Prijave</string>
<!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs">Kartice</string>
<string name="preferences_sync_tabs_2">Otvorene kartice</string>
<!-- Preference for signing out -->
<string name="preferences_sign_out">Odjavi se</string>
<!-- Preference displays and allows changing current FxA device name -->
@ -451,6 +454,24 @@
<string name="tabs_header_private_tabs_title">Privatne kartice</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_tab">Dodaj karticu</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_private_tab">Dodaj privatnu karticu</string>
<!-- Text for the new tab button to indicate adding a new private tab in the tab -->
<string name="tab_drawer_fab_content">Privatno</string>
<!-- Text shown as the title of the open tab tray -->
<string name="tab_tray_title">Otvorene kartice</string>
<!-- Text shown in the menu for saving tabs to a collection -->
<string name="tab_tray_menu_item_save">Spremi u zbirku</string>
<!-- Text shown in the menu for sharing all tabs -->
<string name="tab_tray_menu_item_share">Podijeli sve kartice</string>
<!-- Text shown in the menu for closing all tabs -->
<string name="tab_tray_menu_item_close">Zatvori sve kartice</string>
<!-- Shortcut action to open new tab -->
<string name="tab_tray_menu_open_new_tab">Nova kartica</string>
<!-- Shortcut action to open the home screen -->
<string name="tab_tray_menu_home">Idi na početnu</string>
<!-- Shortcut action to toggle private mode -->
<string name="tab_tray_menu_toggle">Promijeni vrstu kartice</string>
<!-- Content description (not visible, for screen readers etc.): Removes tab from collection button. Removes the selected tab from collection when pressed -->
<string name="remove_tab_from_collection">Ukloni karticu iz zbirke</string>
<!-- Content description (not visible, for screen readers etc.): Close tab button. Closes the current session when pressed -->
@ -464,7 +485,7 @@
<!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">Dijeli kartice</string>
<!-- Open tabs menu item to save tabs to collection -->
<string name="tabs_menu_save_to_collection">Spremi u zbirku</string>
<string name="tabs_menu_save_to_collection1">Spremi kartice u zbirku</string>
<!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">Izbornik za kartice</string>
<!-- Tab menu item to share the tab -->
@ -681,17 +702,15 @@
<string name="delete_browsing_data_quit_off">Isključeno</string>
<!-- Collections -->
<!-- Label to describe what collections are to a new user without any collections -->
<string name="collections_description">Sakupi stvari koje su ti važne. Za početak spremi otvorene kartice u novu zbirku.</string>
<!-- Collections header on home fragment -->
<string name="collections_header">Zbirke</string>
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed -->
<string name="collection_menu_button_content_description">Izbornik za zbirke</string>
<!-- No Open Tabs Message Header -->
<string name="no_collections_header">Nema zbirki</string>
<!-- No Open Tabs Message Description -->
<string name="no_collections_description">Tvoje zbirke će se prikazati ovdje.</string>
<!-- No Open Tabs Message Header -->
<string name="no_collections_header1">Skupi stvari koje su ti bitne</string>
<!-- Label to describe what collections are to a new user without any collections -->
<string name="no_collections_description1">Grupiraj slične pretrage, stranice i kartice za brži pristup kasnije.</string>
<!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">Odaberi kartice</string>
<!-- Title for the "select collection" step of the collection creator -->
@ -721,6 +740,9 @@
<!-- Button to save currently selected tabs in the "select tabs" step of the collection creator-->
<string name="create_collection_save">Spremi</string>
<!-- Snackbar action to view the collection the user just created or updated -->
<string name="create_collection_view">Prikaži</string>
<!-- Default name for a new collection in "name new collection" step of the collection creator. %d is a placeholder for the number of collections-->
<string name="create_collection_default_name">Zbirka %d</string>
@ -895,8 +917,9 @@
<!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description">Firefox Nightly se aktualizira svake večeri i sadrži nove eksperimentalne funkcije.
        Međutim, vjerojatno je manje stabilna verzija. Preuzmi naš beta preglednik za stabilnije iskustvo.</string>
<!-- text for firefox preview moving tip button. "Mozilla Firefox Browser" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_button">Nabavi Mozilla Firefox preglednik</string>
<!-- text for firefox preview moving tip button. "Firefox for Android Beta" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_button_2">Preuzmite Firefox za Android Beta</string>
<!-- text for firefox preview moving tip header. "Firefox Nightly" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header_preview_installed">Firefox Nightly se preselio</string>
@ -949,22 +972,22 @@
<string name="onboarding_firefox_account_sync_is_on">Sinkronizacija je uključena</string>
<!-- text to display in the snackbar if automatic sign-in fails. user may try again -->
<string name="onboarding_firefox_account_automatic_signin_failed">Neuspjela prijava</string>
<!-- text for the tracking protection onboarding card header -->
<string name="onboarding_tracking_protection_header">Zaštiti se</string>
<string name="onboarding_tracking_protection_header_2">Automatska privatnost</string>
<!-- text for the tracking protection card description
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_tracking_protection_description1">%s pomaže spriječiti web-stranice da te prate putem interneta.</string>
<string name="onboarding_tracking_protection_description_2">Postavke za privatnost i sigurnost blokiraju softver za praćenje, zlonamjerni softver i tvrtke koje te prate.</string>
<!-- text for tracking protection radio button option for standard level of blocking -->
<string name="onboarding_tracking_protection_standard_button">Standardno</string>
<string name="onboarding_tracking_protection_standard_button_2">Standardno (zadano)</string>
<!-- text for standard blocking option button description -->
<string name="onboarding_tracking_protection_standard_button_description">Blokira manji broj programa za praćenje, ali omogućava normalno učitavanje stranica</string>
<string name="onboarding_tracking_protection_standard_button_description_2">Blokira manje softvera za praćenje. Stranice se učitavaju normalno.</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">Strogo (preporučeno)</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_option">Strogo</string>
<!-- text for strict blocking option button description -->
<string name="onboarding_tracking_protection_strict_button_description">Blokira veći broj programa za praćenje i pruža bolju zaštitu i performanse, ali može prouzrokovati da neke web stranice ne rade ispravno</string>
<string name="onboarding_tracking_protection_strict_button_description_2">Blokira više softvera za praćenje, oglasa i skočnih prozora. Stranice se brže učitavaju, ali neke značajke možda neće raditi.</string>
<!-- text for the toolbar position card header
In English this is an idiom for "choose a side as in an argument or fight"
but it is ok to make this more literally about "choosing a position in a physical space -->
@ -1052,31 +1075,21 @@
<!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">Saznaj više</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_option">Standardno</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard">Standardno (preporučeno)</string>
<string name="preference_enhanced_tracking_protection_standard_default_1">Standardno (zadano)</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description">Uravnoteženo za zaštitu i performancu.</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description_2">Stranice će se normalno učitati, ali blokiraju manji broj programa za praćenje.</string>
<string name="preference_enhanced_tracking_protection_standard_description_3">Blokira manje softvera za praćenje. Stranice se učitavaju normalno.</string>
<!-- Accessibility text for the Standard protection information icon -->
<string name="preference_enhanced_tracking_protection_standard_info_button">Što se blokira standardnom zaštitom od praćenja</string>
<!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">Strogo</string>
<!-- Preference for enhanced tracking protection for the strict protection settings, default setting -->
<string name="preference_enhanced_tracking_protection_strict_default">Strogo (standardno)</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_default_description">Jača zaštita od praćenja i brži rad, ali neke web-stranice možda neće ispravno raditi.</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_strict_recommended">Strogo (preporučeno)</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_description">Jača zaštita, ali može prouzročiti probleme nekim web-stranicama ili sadržajima.</string>
<string name="preference_enhanced_tracking_protection_strict_description_2">Blokira više softvera za praćenje, oglasa i skočnih prozora. Stranice se brže učitavaju, ali neke značajke možda neće raditi.</string>
<!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_strict_info_button">Što se blokira strogom zaštitom od praćenja</string>
<!-- Preference for enhanced tracking protection for the custom protection settings -->
<string name="preference_enhanced_tracking_protection_custom">Prilagođeno</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_custom_description">Odaberi programe za praćenje i skripte koje želiš blokirati.</string>
<string name="preference_enhanced_tracking_protection_custom_description_2">Odaberi koji softver za praćenje i skripte blokirati.</string>
<!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_custom_info_button">Što se blokira prilagođenom zaštitom od praćenja</string>
<!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings -->
@ -1126,9 +1139,9 @@
<string name="etp_tracking_content_title">Praćenje sadržaja</string>
<!-- Description of tracking content that can be blocked by Enhanced Tracking Protection -->
<string name="etp_tracking_content_description">Zaustavlja učitavanje vanjskih oglasa, videozapisa i drugog sadržaja koji sadrži kod za praćenje. Može utjecati na neke funkcionalnosti web-stranice.</string>
<!-- Enhanced Tracking Protection Onboarding Message shown in a dialog above the toolbar. The first parameter is the name of the application (For example: Fenix) -->
<string name="etp_onboarding_message_2">%s blokira programe za praćenje na ovoj web-stranici kad je štit ljubičaste boje. Dodirni ga i vidi što je blokirano.</string>
<!-- Enhanced Tracking Protection Onboarding Message shown in a dialog above the toolbar. The first parameter is the name of the application (For example: Fenix) -->
<string name="etp_onboarding_cfr_message">Svaki puta kada je štit ljubičast, %s je blokirao softver za praćenje na stranici. Dodirni za više informacija.</string>
<!-- Enhanced Tracking Protection message that protection is currently on for this site -->
<string name="etp_panel_on">Za ovu web-stranicu zaštite su UKLJUČENE</string>
<!-- Enhanced Tracking Protection message that protection is currently off for this site -->
@ -1418,6 +1431,9 @@
<!-- Voice search prompt description displayed after the user presses the voice search button -->
<string name="voice_search_explainer">Govorite sada</string>
<!-- The error message in edit login view when a duplicate username exists. -->
<string name="saved_login_duplicate">Prijava s tim korisničkim imenom već postoji</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Poveži s Firefox računom.</string>
@ -1428,4 +1444,19 @@
<!-- Text displayed when user has disabled tab syncing in Firefox Sync Account -->
<string name="synced_tabs_enable_tab_syncing">Omogućite sinkroniziranje kartica.</string>
<!-- Text displayed when user has no tabs that have been synced -->
<string name="synced_tabs_no_tabs">Nemaš otvorene kartice u Firefoxu na drugim uređajima.</string>
<!-- Text displayed in the synced tabs screen when a user is not signed in to Firefox Sync describing Synced Tabs -->
<string name="synced_tabs_sign_in_message">Pogledaj popis kartica s tvojih drugih uređaja.</string>
<!-- Text displayed on a button in the synced tabs screen to link users to sign in when a user is not signed in to Firefox Sync -->
<string name="synced_tabs_sign_in_button">Prijavi se za sinkronizaciju</string>
<!-- Top Sites -->
<!-- Title text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_title">Dostignuto ograničenje za omiljene stranice</string>
<!-- Content description text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_content">Za dodavanje nove omiljene stranice, ukloni neku. Pritisni i drži stranicu, zatim odaberi ukloni.</string>
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">U redu, shvaćam</string>
</resources>

View File

@ -14,8 +14,6 @@
<string name="content_description_disable_private_browsing_button">Zakázať súkromné prehliadanie</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Hľadať</string>
<!-- No Open Tabs Message Header -->
<string name="no_open_tabs_header_2">Žiadne otvorené karty</string>
<!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">Vaše otvorené karty budú zobrazené tu.</string>
@ -105,8 +103,6 @@
<string name="browser_menu_new_tab">Nová karta</string>
<!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">Uložiť do kolekcie</string>
<!-- Browser menu button that opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">Nahlásiť problém so stránkou</string>
<!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">Zdieľať</string>
<!-- Share menu title, displayed when a user is sharing their current site -->
@ -122,7 +118,7 @@
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="browser_menu_powered_by2">Poháňané aplikáciou %1$s</string>
<!-- Browser menu button to put the the current page in reader mode -->
<!-- Browser menu button to put the current page in reader mode -->
<string name="browser_menu_read">Zobrazenie Čítačka</string>
<!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">Otvoriť v aplikácii</string>
@ -298,8 +294,6 @@
<string name="preferences_sync_bookmarks">Záložky</string>
<!-- Preference for syncing logins -->
<string name="preferences_sync_logins">Prihlasovacie údaje</string>
<!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs">Karty</string>
<!-- Preference for signing out -->
<string name="preferences_sign_out">Odhlásiť sa</string>
<!-- Preference displays and allows changing current FxA device name -->
@ -456,6 +450,8 @@
<string name="tabs_header_private_tabs_title">Súkromné karty</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_tab">Pridať kartu</string>
<!-- Shortcut action to open new tab -->
<string name="tab_tray_menu_open_new_tab">Nová karta</string>
<!-- Content description (not visible, for screen readers etc.): Removes tab from collection button. Removes the selected tab from collection when pressed -->
<string name="remove_tab_from_collection">Odstrániť kartu z kolekcie</string>
<!-- Content description (not visible, for screen readers etc.): Close tab button. Closes the current session when pressed -->
@ -468,8 +464,6 @@
<string name="tabs_menu_close_all_tabs">Zavrieť všetky karty</string>
<!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">Zdieľať karty</string>
<!-- Open tabs menu item to save tabs to collection -->
<string name="tabs_menu_save_to_collection">Uložiť do kolekcie</string>
<!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">Ponuka kariet</string>
<!-- Tab menu item to share the tab -->
@ -683,16 +677,10 @@
<string name="delete_browsing_data_quit_off">Vypnuté</string>
<!-- Collections -->
<!-- Label to describe what collections are to a new user without any collections -->
<string name="collections_description">Ukladajte si stránky a karty, na ktorých vám záleží, do kolekcií.</string>
<!-- Collections header on home fragment -->
<string name="collections_header">Kolekcie</string>
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed -->
<string name="collection_menu_button_content_description">Ponuka kolekcií</string>
<!-- No Open Tabs Message Header -->
<string name="no_collections_header">Nemáte žiadne kolekcie</string>
<!-- No Open Tabs Message Description -->
<string name="no_collections_description">Vaše kolekcie budú zobrazené tu.</string>
<!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">Výber kariet</string>
@ -723,6 +711,9 @@
<!-- Button to save currently selected tabs in the "select tabs" step of the collection creator-->
<string name="create_collection_save">Uložiť</string>
<!-- Snackbar action to view the collection the user just created or updated -->
<string name="create_collection_view">Zobraziť</string>
<!-- Default name for a new collection in "name new collection" step of the collection creator. %d is a placeholder for the number of collections-->
<string name="create_collection_default_name">Kolekcia %d</string>
@ -899,8 +890,6 @@
<!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description">Firefox Nightly je aktualizovaný každý deň a obsahuje experimentálne funkcie.
Môže však byť menej stabilný. Ak chcete stabilnejší prehliadač, prevezmite si beta verziu.</string>
<!-- text for firefox preview moving tip button. "Mozilla Firefox Browser" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_button">Prevezmite si prehliadač Mozilla Firefox</string>
<!-- text for firefox preview moving tip header. "Firefox Nightly" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header_preview_installed">Firefox Nightly sa presunul</string>
@ -953,21 +942,10 @@
<string name="onboarding_firefox_account_sync_is_on">Synchronizácia je zapnutá</string>
<!-- text to display in the snackbar if automatic sign-in fails. user may try again -->
<string name="onboarding_firefox_account_automatic_signin_failed">Prihlásenie zlyhalo</string>
<!-- text for the tracking protection onboarding card header -->
<string name="onboarding_tracking_protection_header">Chráňte sa</string>
<!-- text for the tracking protection card description
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_tracking_protection_description1">%s bráni webovým stránkam vo vašom sledovaní.</string>
<!-- text for tracking protection radio button option for standard level of blocking -->
<string name="onboarding_tracking_protection_standard_button">Štandardná</string>
<!-- text for standard blocking option button description -->
<string name="onboarding_tracking_protection_standard_button_description">Blokuje menej sledovacích prvkov, no umožňuje normálne načítanie stránok</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">Prísna (odporúčaná)</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_option">Prísna</string>
<!-- text for strict blocking option button description -->
<string name="onboarding_tracking_protection_strict_button_description">Blokuje viac sledovacích prvkov, vďaka čomu vám poskytuje väčšiu ochranu a výkon, no môže spôsobiť chybné fungovanie niektorých stránok</string>
<!-- text for the toolbar position card header
In English this is an idiom for "choose a side as in an argument or fight"
but it is ok to make this more literally about "choosing a position in a physical space -->
@ -1054,32 +1032,14 @@
<string name="preference_enhanced_tracking_protection_explanation">%s vás chráni pred mnohými sledovacími prvkami, ktoré zbierajú informácie o tom, čo robíte na internete.</string>
<!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">Ďalšie informácie</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_option">Štandardná</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard">Štandardná (odporúčaná)</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description">Vyvážená ochrana a výkon.</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description_2">Stránky sa budú načítavať normálne, no budú obsahovať menej sledovacích prvkov.</string>
<!-- Accessibility text for the Standard protection information icon -->
<string name="preference_enhanced_tracking_protection_standard_info_button">Čo blokuje štandardná ochrana pred sledovaním</string>
<!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">Prísna</string>
<!-- Preference for enhanced tracking protection for the strict protection settings, default setting -->
<string name="preference_enhanced_tracking_protection_strict_default">Prísna (predvolená)</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_default_description">Silnejšia ochrana, ktorá zrýchľuje načítavanie stránok. Môže však obmedziť ich fungovanie.</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_strict_recommended">Prísna (odporúčaná)</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_description">Viac blokovaného obsahu zvyšuje pravdepodobnosť, že niektoré stránky nebudú správne fungovať.</string>
<!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_strict_info_button">Čo blokuje prísna ochrana pred sledovaním</string>
<!-- Preference for enhanced tracking protection for the custom protection settings -->
<string name="preference_enhanced_tracking_protection_custom">Vlastná</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_custom_description">Vyberte sledovacie prvky a skripty, ktoré chcete blokovať</string>
<!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_custom_info_button">Čo blokuje vlastná ochrana pred sledovaním</string>
<!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings -->
@ -1128,8 +1088,6 @@
<string name="etp_tracking_content_title">Sledovací obsah</string>
<!-- Description of tracking content that can be blocked by Enhanced Tracking Protection -->
<string name="etp_tracking_content_description">Blokuje načítanie reklám, videí a ďalšieho obsahu, ktorý obsahuje sledovací kód. To môže ovplyvniť fungovanie niektorých webových stránok.</string>
<!-- Enhanced Tracking Protection Onboarding Message shown in a dialog above the toolbar. The first parameter is the name of the application (For example: Fenix) -->
<string name="etp_onboarding_message_2">Ak je ikona štítu fialová, znamená to, že %s na stránke blokuje nejaké sledovacie prvky. Ťuknutím na ikonu zobrazíte ich zoznam.</string>
<!-- Enhanced Tracking Protection message that protection is currently on for this site -->
<string name="etp_panel_on">Ochrana je na tejto stránke zapnutá</string>
<!-- Enhanced Tracking Protection message that protection is currently off for this site -->
@ -1423,4 +1381,9 @@
<!-- Text displayed when user has disabled tab syncing in Firefox Sync Account -->
<string name="synced_tabs_enable_tab_syncing">Prosím, zapnite synchronizovanie kariet.</string>
<!-- Content description text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_content">Ak chcete pridať novú top stránku, musíte jednu odstrániť. Podržte na nej prst a vyberte možnosť Odstrániť.</string>
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Ok, rozumiem</string>
</resources>

View File

@ -99,6 +99,9 @@
<!-- Preference for data collection -->
<string name="preferences_data_collection"></string>
<!-- Preference for account settings -->
<string name="preferences_account_settings">ఖాతా అమరికలు</string>
<!-- Preference for syncing history -->
<string name="preferences_sync_history">చరిత్ర</string>
<!-- Preference for syncing bookmarks -->

View File

@ -13,8 +13,6 @@
<string name="content_description_disable_private_browsing_button">ปิดใช้งานการเรียกดูแบบส่วนตัว</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">ค้นหาหรือป้อนที่อยู่</string>
<!-- No Open Tabs Message Header -->
<string name="no_open_tabs_header_2">ไม่มีแท็บที่เปิดอยู่</string>
<!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">แท็บที่คุณเปิดจะถูกแสดงที่นี่</string>
@ -104,8 +102,6 @@
<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_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 -->
<string name="browser_menu_share">แบ่งปัน</string>
<!-- Share menu title, displayed when a user is sharing their current site -->
@ -119,7 +115,7 @@
<!-- 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">ขับเคลื่อนโดย %1$s</string>
<!-- Browser menu button to put the the current page in reader mode -->
<!-- Browser menu button to put the current page in reader mode -->
<string name="browser_menu_read">มุมมองผู้อ่าน</string>
<!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">เปิดในแอป</string>
@ -293,7 +289,7 @@
<!-- Preference for syncing logins -->
<string name="preferences_sync_logins">การเข้าสู่ระบบ</string>
<!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs">แท็บ</string>
<string name="preferences_sync_tabs_2">แท็บที่เปิดอยู่</string>
<!-- Preference for signing out -->
<string name="preferences_sign_out">ลงชื่อออก</string>
<!-- Preference displays and allows changing current FxA device name -->
@ -460,8 +456,6 @@
<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 -->
@ -673,17 +667,10 @@
<string name="delete_browsing_data_quit_off">ปิด</string>
<!-- Collections -->
<!-- Label to describe what collections are to a new user without any collections -->
<string name="collections_description">รวบรวมสิ่งที่สำคัญสำหรับคุณ เมื่อต้องการเริ่มต้น ให้บันทึกแท็บที่เปิดอยู่ไปยังชุดสะสมใหม่</string>
<!-- Collections header on home fragment -->
<string name="collections_header">ชุดสะสม</string>
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed -->
<string name="collection_menu_button_content_description">เมนูชุดสะสม</string>
<!-- No Open Tabs Message Header -->
<string name="no_collections_header">ไม่มีชุดสะสม</string>
<!-- No Open Tabs Message Description -->
<string name="no_collections_description">ชุดสะสมของคุณจะถูกแสดงที่นี่</string>
<!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">เลือกแท็บ</string>
<!-- Title for the "select collection" step of the collection creator -->
@ -887,8 +874,6 @@
<!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description">Firefox Nightly อัปเดตทุกคืนและมีลูกเล่นใหม่ ๆ ทุกคืน
        อย่างไรก็ตามความเสถียรอาจลดลง ดาวน์โหลดเบราว์เซอร์เบต้าของเราเพื่อประสบการณ์ที่เสถียรยิ่งขึ้น</string>
<!-- text for firefox preview moving tip button. "Mozilla Firefox Browser" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_button">รับ Mozilla Firefox เบราว์เซอร์</string>
<!-- text for firefox preview moving tip header. "Firefox Nightly" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header_preview_installed">Firefox Nightly ย้ายไปแล้ว</string>
@ -941,21 +926,10 @@
<string name="onboarding_firefox_account_sync_is_on">Sync เปิดอยู่</string>
<!-- text to display in the snackbar if automatic sign-in fails. user may try again -->
<string name="onboarding_firefox_account_automatic_signin_failed">ไม่สามารถเข้าสู่ระบบ</string>
<!-- text for the tracking protection onboarding card header -->
<string name="onboarding_tracking_protection_header">ปกป้องตัวคุณเอง</string>
<!-- text for the tracking protection card description
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_tracking_protection_description1">%s ช่วยหยุดเว็บไซต์จากการติดตามคุณออนไลน์</string>
<!-- text for tracking protection radio button option for standard level of blocking -->
<string name="onboarding_tracking_protection_standard_button">มาตรฐาน</string>
<!-- text for standard blocking option button description -->
<string name="onboarding_tracking_protection_standard_button_description">ปิดกันตัวติดตามน้อยลง แต่อนุญาตให้โหลดหน้าได้ตามปกติ</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">เข้มงวด (แนะนำ)</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_option">เข้มงวด</string>
<!-- text for strict blocking option button description -->
<string name="onboarding_tracking_protection_strict_button_description">ปิดกันตัวติดตามมากขึ้นเพื่อการปกป้องและประสิทธิภาพที่ดีกว่า แต่ก็อาจทำให้บางไซต์ทำงานไม่สมบูรณ์</string>
<!-- text for the toolbar position card header
In English this is an idiom for "choose a side as in an argument or fight"
but it is ok to make this more literally about "choosing a position in a physical space -->
@ -1041,32 +1015,14 @@
<string name="preference_enhanced_tracking_protection_explanation">เก็บข้อมูลของคุณไว้กับตัวคุณเอง %s ปกป้องคุณจากตัวติดตามที่พบบ่อยที่สุดซึ่งติดตามสิ่งที่คุณทำทางออนไลน์</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 description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description">การป้องกันและประสิทธิภาพแบบสมดุล</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description_2">หน้าเว็บจะโหลดตามปกติ แต่ปิดกั้นตัวติดตามน้อยลง</string>
<!-- Accessibility text for the Standard protection information icon -->
<string name="preference_enhanced_tracking_protection_standard_info_button">สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบมาตรฐาน</string>
<!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">เข้มงวด</string>
<!-- Preference for enhanced tracking protection for the strict protection settings, default setting -->
<string name="preference_enhanced_tracking_protection_strict_default">เข้มงวด (ค่าเริ่มต้น)</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_default_description">การป้องกันการติดตามที่แข็งแกร่งขึ้นและประสิทธิภาพที่เร็วขึ้น แต่บางไซต์อาจไม่ทำงานอย่างถูกต้อง</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_strict_recommended">เข้มงวด (แนะนำ)</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_description">การป้องกันที่แกร่งขึ้น แต่อาจทำให้บางไซต์หรือเนื้อหาหยุดทำงานได้</string>
<!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_strict_info_button">สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบเข้มงวด</string>
<!-- Preference for enhanced tracking protection for the custom protection settings -->
<string name="preference_enhanced_tracking_protection_custom">กำหนดเอง</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_custom_description">เลือกตัวติดตามหรือสคริปต์ที่ต้องการปิดกั้น</string>
<!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_custom_info_button">สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบกำหนดเอง</string>
<!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings -->
@ -1116,8 +1072,6 @@
<!-- Description of tracking content that can be blocked by Enhanced Tracking Protection -->
<string name="etp_tracking_content_description">หยุดไม่ให้โหลดโฆษณาภายนอก, วิดีโอ, และเนื้อหาอื่น ๆ ที่มีรหัสการติดตาม อาจส่งผลต่อฟังก์ชันการทำงานของบางเว็บไซต์</string>
<!-- Enhanced Tracking Protection Onboarding Message shown in a dialog above the toolbar. The first parameter is the name of the application (For example: Fenix) -->
<string name="etp_onboarding_message_2">%s กำลังปิดกั้นตัวติดตามบนไซต์นี้เมื่อเกราะเป็นสีม่วง แตะเพื่อดูสิ่งที่ถูกปิดกั้น</string>
<!-- Enhanced Tracking Protection message that protection is currently on for this site -->
<string name="etp_panel_on">การป้องกันถูก เปิด สำหรับไซต์นี้</string>
<!-- Enhanced Tracking Protection message that protection is currently off for this site -->
@ -1399,4 +1353,5 @@
<string name="synced_tabs_connect_to_sync_account">เชื่อมต่อกับบัญชี Firefox</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">เชื่อมต่ออุปกรณ์อื่น</string>
</resources>

View File

@ -1438,6 +1438,8 @@
<!-- Top Sites -->
<!-- Title text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_title">Sık kullanılan site sınırına ulaşıldı</string>
<!-- Content description text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_content">Yeni bir sık kullanılan site eklemek için bir siteyi kaldırın. Siteye basılı tutup kaldırı seçin.</string>
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Tamam</string>

View File

@ -765,6 +765,78 @@
<!-- Sub-header in the dialog to share a link to an app from the full list -->
<string name="share_link_all_apps_subheader">Daran\' sun huā</string>
<!-- Sub-header in the dialog to share a link to an app from the most-recent sorted list -->
<string name="share_link_recent_apps_subheader">Hìaj garâj sun nākàt</string>
<!-- An option from the share dialog to sign into sync -->
<string name="sync_sign_in">Gāyi\'ì sēsiû riña Sync</string>
<!-- An option from the share dialog to send link to all other sync devices -->
<string name="sync_send_to_all">Gā \'nïnj gan\'an riña daran\' nej aga\'a</string>
<!-- An option from the share dialog to reconnect to sync -->
<string name="sync_reconnect">Gānātū nākà ñû riña Sync</string>
<!-- Text displayed when sync is offline and cannot be accessed -->
<string name="sync_offline">Nitāj kōneksiûn hua</string>
<!-- An option to connect additional devices -->
<string name="sync_connect_device">Gātū\' ngà a\'ngô aga\'a</string>
<!-- The dialog text shown when additional devices are not available -->
<string name="sync_connect_device_dialog">Da\' ga\'ue gā\'nïnjt \'ngō rakïj ñanj, da\'uît gāyi\'ìt sēsiûn riña a\'ngô aga\'a,</string>
<!-- Confirmation dialog button -->
<string name="sync_confirmation_button">Ngà gunïn</string>
<!-- Share error message -->
<string name="share_error_snackbar">Si ga\'ue gà\'nïn\' riña duguî\' aplikasiûn nan</string>
<!-- Add new device screen title -->
<string name="sync_add_new_device_title">Gā\'nïnj riña aga\'</string>
<!-- Text for the warning message on the Add new device screen -->
<string name="sync_add_new_device_message">Nitāj à\'ngō aga\'a hua kōnektadô</string>
<!-- Text for the button to learn about sending tabs -->
<string name="sync_add_new_device_learn_button">Gāhuin chrūn doj dàj gà\'nïn\' rakïj ñanj gan\'an…</string>
<!-- Text for the button to connect another device -->
<string name="sync_add_new_device_connect_button">Gī\'iaj kōnektandô a\'ngô aga\'a…</string>
<!-- Notifications -->
<!-- The user visible name of the "notification channel" (Android 8+ feature) for the ongoing notification shown while a browsing session is active. -->
<string name="notification_pbm_channel_name">Sēsiûn riña gāchē nu huìt</string>
<!-- Text shown in the notification that pops up to remind the user that a private browsing session is active. -->
<string name="notification_pbm_delete_text">Nādure\' nej rakïj ñanj huìi</string>
<!-- Text shown in the notification that pops up to remind the user that a private browsing session is active. -->
<string name="notification_pbm_delete_text_2">Nārán riña nej rakïj ñanj huìi</string>
<!-- Notification action to open Fenix and resume the current browsing session. -->
<string name="notification_pbm_action_open">Nā\'nīn</string>
<!-- Notification action to delete all current private browsing sessions AND switch to Fenix (bring it to the foreground) -->
<string name="notification_pbm_action_delete_and_open">Nādure\' nī na\'nïnt</string>
<!-- Name of the "Powered by Fenix" notification channel. Displayed in the "App notifications" system settings for the app -->
<string name="notification_powered_by_channel_name">Giri sa gù\'nàj</string>
<!-- Text shown in snackbar when user deletes a collection -->
<string name="snackbar_collection_deleted">Ganare\' sa ganachra chrē\'t</string>
<!-- Text shown in snackbar when user renames a collection -->
<string name="snackbar_collection_renamed">Nadunâ si yūgui sa ganachra chrē\'t</string>
<!-- Text shown in snackbar when user deletes a tab -->
<string name="snackbar_tab_deleted">Ganare\' rakïj ñanj</string>
<!-- Text shown in snackbar when user deletes all tabs -->
<string name="snackbar_tabs_deleted">Ganare\' nej rakïj ñanj</string>
<!-- Text shown in snackbar when user closes a tab -->
<string name="snackbar_tab_closed">Ganarán riña rakïj ñanj</string>
<!-- Text shown in snackbar when user closes all tabs -->
<string name="snackbar_tabs_closed">Ganarán riña nej rakïj ñanj</string>
<!-- Text for action to undo deleting a tab or collection shown in a11y dialog -->
<string name="a11y_dialog_deleted_undo">Dūre\'</string>
<!-- Text for action to confirm deleting a tab or collection shown in a11y dialog -->
<string name="a11y_dialog_deleted_confirm">Gī\'iaj hīa</string>
<!-- QR code scanner prompt which appears after scanning a code, but before navigating to it
First parameter is the name of the app, second parameter is the URL or text scanned-->
<string name="qr_scanner_confirmation_dialog_message">Gā\'nïn riña %1$s gā\'nïn %2$s</string>
<!-- Tab collection deletion prompt dialog option to delete the collection -->
<string name="tab_collection_dialog_positive">Nādūre\'</string>
<!-- Tab collection deletion prompt dialog option to cancel deleting the collection -->
<string name="tab_collection_dialog_negative">Dūyichin\'</string>
<!-- Title for the tabs item in Delete browsing data -->
<string name="preferences_delete_browsing_data_tabs_title_2">Nā\'nïn nej rakïj ñanj</string>
<!-- Subtitle for the tabs item in Delete browsing data, parameter will be replaced with the number of open tabs -->
<string name="preferences_delete_browsing_data_tabs_subtitle">%d nej rakïj ñanj</string>
<!-- Content description (not visible, for screen readers etc.): Close onboarding screen -->
<string name="onboarding_close">Nārán</string>

View File

@ -26,6 +26,11 @@
<string name="pref_key_delete_cookies_on_quit" translatable="false">pref_key_delete_cookies_on_quit</string>
<string name="pref_key_delete_caches_on_quit" translatable="false">pref_key_delete_caches_on_quit</string>
<string name="pref_key_delete_permissions_on_quit" translatable="false">pref_key_delete_permissions_on_quit</string>
<string name="pref_key_delete_open_tabs_now" translatable="false">pref_key_delete_open_tabs_now</string>
<string name="pref_key_delete_browsing_history_now" translatable="false">pref_key_delete_browsing_history_now</string>
<string name="pref_key_delete_cookies_now" translatable="false">pref_key_delete_cookies_now</string>
<string name="pref_key_delete_caches_now" translatable="false">pref_key_delete_caches_now</string>
<string name="pref_key_delete_permissions_now" translatable="false">pref_key_delete_permissions_now</string>
<string name="pref_key_delete_browsing_data_on_quit_categories" translatable="false">pref_key_delete_browsing_data_on_quit_categories</string>
<string name="pref_key_last_known_mode_private" translatable="false">pref_key_last_known_mode_private</string>
<string name="pref_key_addons" translatable="false">pref_key_addons</string>

View File

@ -566,8 +566,6 @@
<string name="bookmark_select_folder">Select folder</string>
<!-- Confirmation message for a dialog confirming if the user wants to delete the selected folder -->
<string name="bookmark_delete_folder_confirmation_dialog">Are you sure you want to delete this folder?</string>
<!-- Confirmation message for a dialog confirming if the user wants to delete multiple items including folders. Parameter will be replaced by app name. -->
<string name="bookmark_delete_multiple_folders_confirmation_dialog">%s will delete the selected items.</string>
<!-- Snackbar title shown after a folder has been deleted. This first parameter is the name of the deleted folder -->
<string name="bookmark_delete_folder_snackbar">Deleted %1$s</string>
<!-- Screen title for adding a bookmarks folder -->
@ -622,10 +620,8 @@
<!-- Bookmark snackbar message on deletion
The first parameter is the host part of the URL of the bookmark deleted, if any -->
<string name="bookmark_deletion_snackbar_message">Deleted %1$s</string>
<!-- Bookmark snackbar message on deleting multiple bookmarks not including folders-->
<!-- Bookmark snackbar message on deleting multiple bookmarks -->
<string name="bookmark_deletion_multiple_snackbar_message_2">Bookmarks deleted</string>
<!-- Bookmark snackbar message on deleting multiple bookmarks including folders-->
<string name="bookmark_deletion_multiple_snackbar_message_3">Deleting selected folders</string>
<!-- Bookmark undo button for deletion snackbar action -->
<string name="bookmark_undo_deletion">UNDO</string>
@ -875,8 +871,6 @@
<string name="preference_summary_delete_browsing_data_on_quit">Automatically deletes browsing data when you select "Quit" from the main menu</string>
<!-- Summary for the Delete browsing data on quit preference. "Quit" translation should match delete_browsing_data_on_quit_action translation. -->
<string name="preference_summary_delete_browsing_data_on_quit_2">Automatically deletes browsing data when you select \"Quit\" from the main menu</string>
<!-- Category for history items to delete on quit in delete browsing data on quit -->
<string name="preferences_delete_browsing_data_on_quit_browsing_history">Browsing history</string>
<!-- Action item in menu for the Delete browsing data on quit feature -->
<string name="delete_browsing_data_on_quit_action">Quit</string>

View File

@ -5,7 +5,6 @@
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<SwitchPreference
app:iconSpaceReserved="false"
android:defaultValue="false"
android:key="@string/pref_key_delete_browsing_data_on_quit"
android:summary="@string/preference_summary_delete_browsing_data_on_quit_2"
@ -15,28 +14,28 @@
android:key="@string/pref_key_delete_browsing_data_on_quit_categories"
app:allowDividerAbove="false"
app:iconSpaceReserved="false"
android:layout="@layout/preference_cat_style">
android:layout="@layout/preference_category_empty">
<CheckBoxPreference
android:key="@string/pref_key_delete_open_tabs_on_quit"
android:layout="@layout/delete_browsing_category_checkbox"
android:layout="@layout/checkbox_left_preference"
android:title="@string/preferences_delete_browsing_data_tabs_title_2" />
<CheckBoxPreference
android:key="@string/pref_key_delete_browsing_history_on_quit"
android:layout="@layout/delete_browsing_category_checkbox"
android:title="@string/preferences_delete_browsing_data_on_quit_browsing_history" />
android:layout="@layout/checkbox_left_preference"
android:title="@string/preferences_delete_browsing_data_browsing_data_title" />
<CheckBoxPreference
android:key="@string/pref_key_delete_cookies_on_quit"
android:layout="@layout/delete_browsing_category_checkbox"
android:layout="@layout/checkbox_left_preference"
android:summary="@string/preferences_delete_browsing_data_cookies_subtitle"
android:title="@string/preferences_delete_browsing_data_cookies" />
<CheckBoxPreference
android:key="@string/pref_key_delete_caches_on_quit"
android:layout="@layout/delete_browsing_category_checkbox"
android:layout="@layout/checkbox_left_preference"
android:summary="@string/preferences_delete_browsing_data_cached_files_subtitle"
android:title="@string/preferences_delete_browsing_data_cached_files" />
<CheckBoxPreference
android:key="@string/pref_key_delete_permissions_on_quit"
android:layout="@layout/delete_browsing_category_checkbox"
android:layout="@layout/checkbox_left_preference"
android:title="@string/preferences_delete_browsing_data_site_permissions" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@ -42,7 +42,7 @@ class BookmarkControllerTest {
private val navController: NavController = mockk(relaxed = true)
private val showSnackbar: (String) -> Unit = mockk(relaxed = true)
private val deleteBookmarkNodes: (Set<BookmarkNode>, Event) -> Unit = mockk(relaxed = true)
private val deleteBookmarkFolder: (Set<BookmarkNode>) -> Unit = mockk(relaxed = true)
private val deleteBookmarkFolder: (BookmarkNode) -> Unit = mockk(relaxed = true)
private val invokePendingDeletion: () -> Unit = mockk(relaxed = true)
private val homeActivity: HomeActivity = mockk(relaxed = true)
@ -240,10 +240,10 @@ class BookmarkControllerTest {
@Test
fun `handleBookmarkDeletion for a folder should properly call the delete folder delegate`() {
controller.handleBookmarkFolderDeletion(setOf(subfolder))
controller.handleBookmarkFolderDeletion(subfolder)
verify {
deleteBookmarkFolder(setOf(subfolder))
deleteBookmarkFolder(subfolder)
}
}

View File

@ -196,7 +196,7 @@ class BookmarkFragmentInteractorTest {
interactor.onDelete(setOf(subfolder))
verify {
bookmarkController.handleBookmarkFolderDeletion(setOf(subfolder))
bookmarkController.handleBookmarkFolderDeletion(subfolder)
}
}

View File

@ -60,9 +60,7 @@ class HistoryFragmentStoreTest {
fun finishSync() = runBlocking {
val initialState = HistoryFragmentState(
items = listOf(),
mode = HistoryFragmentState.Mode.Syncing,
pendingDeletionIds = emptySet(),
isDeletingItems = false
mode = HistoryFragmentState.Mode.Syncing
)
val store = HistoryFragmentStore(initialState)
@ -73,22 +71,16 @@ class HistoryFragmentStoreTest {
private fun emptyDefaultState(): HistoryFragmentState = HistoryFragmentState(
items = listOf(),
mode = HistoryFragmentState.Mode.Normal,
pendingDeletionIds = emptySet(),
isDeletingItems = false
mode = HistoryFragmentState.Mode.Normal
)
private fun oneItemEditState(): HistoryFragmentState = HistoryFragmentState(
items = listOf(),
mode = HistoryFragmentState.Mode.Editing(setOf(historyItem)),
pendingDeletionIds = emptySet(),
isDeletingItems = false
mode = HistoryFragmentState.Mode.Editing(setOf(historyItem))
)
private fun twoItemEditState(): HistoryFragmentState = HistoryFragmentState(
items = listOf(),
mode = HistoryFragmentState.Mode.Editing(setOf(historyItem, newHistoryItem)),
pendingDeletionIds = emptySet(),
isDeletingItems = false
mode = HistoryFragmentState.Mode.Editing(setOf(historyItem, newHistoryItem))
)
}