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

View File

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

View File

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

View File

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

View File

@ -11,6 +11,7 @@ import org.mozilla.fenix.helpers.HomeActivityTestRule
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By import androidx.test.uiautomator.By
import androidx.test.uiautomator.Until import androidx.test.uiautomator.Until
import org.junit.Ignore
import org.mozilla.fenix.helpers.ext.waitNotNull import org.mozilla.fenix.helpers.ext.waitNotNull
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.ui.robots.PRIVATE_SESSION_MESSAGE 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 @Test
fun privateModeScreenItemsTest() { fun privateModeScreenItemsTest() {
homeScreen { }.dismissOnboarding() homeScreen { }.dismissOnboarding()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -53,7 +53,7 @@ class TopSitesTest {
navigationToolbar { navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) { }.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content) // verifyPageContent(defaultWebPage.content)
}.openThreeDotMenu { }.openThreeDotMenu {
verifyAddFirefoxHome() verifyAddFirefoxHome()
}.addToFirefoxHome { }.addToFirefoxHome {
@ -72,7 +72,7 @@ class TopSitesTest {
navigationToolbar { navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) { }.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content) // verifyPageContent(defaultWebPage.content)
}.openThreeDotMenu { }.openThreeDotMenu {
verifyAddFirefoxHome() verifyAddFirefoxHome()
}.addToFirefoxHome { }.addToFirefoxHome {
@ -82,7 +82,7 @@ class TopSitesTest {
verifyExistingTopSitesList() verifyExistingTopSitesList()
verifyExistingTopSitesTabs(defaultWebPageTitle) verifyExistingTopSitesTabs(defaultWebPageTitle)
}.openTopSiteTabWithTitle(title = defaultWebPageTitle) { }.openTopSiteTabWithTitle(title = defaultWebPageTitle) {
verifyPageContent(defaultWebPage.content) // verifyPageContent(defaultWebPage.content)
verifyUrl(defaultWebPage.url.toString().replace("http://", "")) verifyUrl(defaultWebPage.url.toString().replace("http://", ""))
}.openTabDrawer { }.openTabDrawer {
}.openHomeScreen { }.openHomeScreen {
@ -103,7 +103,7 @@ class TopSitesTest {
navigationToolbar { navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) { }.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content) // verifyPageContent(defaultWebPage.content)
}.openThreeDotMenu { }.openThreeDotMenu {
verifyAddFirefoxHome() verifyAddFirefoxHome()
}.addToFirefoxHome { }.addToFirefoxHome {
@ -126,7 +126,7 @@ class TopSitesTest {
navigationToolbar { navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) { }.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content) // verifyPageContent(defaultWebPage.content)
}.openThreeDotMenu { }.openThreeDotMenu {
verifyAddFirefoxHome() verifyAddFirefoxHome()
}.addToFirefoxHome { }.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. /* Asserts that the text within DOM element with ID="testContent" has the given text, i.e.
* document.querySelector('#testContent').innerText == expectedText * 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()) /* fun verifyPageContent(expectedText: String) {
mDevice.waitNotNull(Until.findObject(By.textContains(expectedText)), waitingTime) // val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
} // mDevice.waitNotNull(Until.findObject(By.textContains(expectedText)), waitingTime)
}*/
fun verifyTabCounter(expectedText: String) { fun verifyTabCounter(expectedText: String) {
onView(withId(R.id.counter_text)) onView(withId(R.id.counter_text))

View File

@ -83,8 +83,6 @@ class HistoryRobot {
.click() .click()
} }
fun verifyDeleteSnackbarText(text: String) = assertSnackBarText(text)
class Transition { class Transition {
fun goBack(interact: HistoryRobot.() -> Unit): Transition { fun goBack(interact: HistoryRobot.() -> Unit): Transition {
goBackButton().click() goBackButton().click()
@ -154,6 +152,3 @@ private fun assertDeleteConfirmationMessage() =
.check(matches(isDisplayed())) .check(matches(isDisplayed()))
private fun assertCopySnackBarText() = snackBarText().check(matches(withText("URL copied"))) 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)) onView(withText(R.string.preferences_delete_browsing_data_tabs_title_2))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .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))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
onView(withText(R.string.preferences_delete_browsing_data_cookies)) onView(withText(R.string.preferences_delete_browsing_data_cookies))

View File

@ -142,6 +142,7 @@ open class FenixApplication : LocaleAwareApplication() {
} }
} }
prefetchForHomeFragment()
setupLeakCanary() setupLeakCanary()
if (settings().isTelemetryEnabled) { if (settings().isTelemetryEnabled) {
components.analytics.metrics.start(MetricServiceType.Data) components.analytics.metrics.start(MetricServiceType.Data)
@ -228,6 +229,13 @@ open class FenixApplication : LocaleAwareApplication() {
// no-op, LeakCanary is disabled by default // 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() { private fun setupPush() {
// Sets the PushFeature as the singleton instance for push messages to go to. // 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 // 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.feature.top.sites.TopSiteStorage
import mozilla.components.support.locale.LocaleManager import mozilla.components.support.locale.LocaleManager
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.observeOnce
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.settings.advanced.getSelectedLocale import org.mozilla.fenix.settings.advanced.getSelectedLocale
@ -86,4 +87,10 @@ class TopSiteStorage(private val context: Context) {
context.settings().defaultTopSitesAdded = true 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, sessionControlInteractor,
homeViewModel homeViewModel
) )
activity.themeManager.applyStatusBarTheme(activity)
view.consumeFrom(homeFragmentStore, viewLifecycleOwner) { updateSessionControlView(view)
sessionControlView?.update(it)
} activity.themeManager.applyStatusBarTheme(activity)
view.consumeFrom(requireComponents.core.store, viewLifecycleOwner) { view.consumeFrom(requireComponents.core.store, viewLifecycleOwner) {
val tabCount = if (currentMode.getCurrentMode() == Mode.Normal) { val tabCount = if (currentMode.getCurrentMode() == Mode.Normal) {
@ -234,6 +233,20 @@ class HomeFragment : Fragment() {
return view 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) { private fun updateLayout(view: View) {
val shouldUseBottomToolbar = view.context.settings().shouldUseBottomToolbar val shouldUseBottomToolbar = view.context.settings().shouldUseBottomToolbar

View File

@ -4,7 +4,6 @@
package org.mozilla.fenix.home.sessioncontrol package org.mozilla.fenix.home.sessioncontrol
import android.os.Build
import android.view.View import android.view.View
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
@ -142,13 +141,8 @@ class SessionControlView(
} }
fun update(state: HomeFragmentState) { 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() val stateAdapterList = state.toAdapterList()
if (homeScreenViewModel.shouldScrollToTopSites) { if (homeScreenViewModel.shouldScrollToTopSites) {
sessionControlAdapter.submitList(stateAdapterList) { sessionControlAdapter.submitList(stateAdapterList) {

View File

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

View File

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

View File

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

View File

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

View File

@ -33,8 +33,6 @@ class HistoryAdapter(
private var mode: HistoryFragmentState.Mode = HistoryFragmentState.Mode.Normal private var mode: HistoryFragmentState.Mode = HistoryFragmentState.Mode.Normal
override val selectedItems get() = mode.selectedItems 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 override fun getItemViewType(position: Int): Int = HistoryListItemViewHolder.LAYOUT_ID
@ -50,33 +48,13 @@ class HistoryAdapter(
} }
override fun onBindViewHolder(holder: HistoryListItemViewHolder, position: Int) { override fun onBindViewHolder(holder: HistoryListItemViewHolder, position: Int) {
val previous = if (position == 0) null else getItem(position - 1)
val current = getItem(position) ?: return 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 val previousHeader = previous?.let(::timeGroupForHistoryItem)
if (itemsWithHeaders.containsKey(headerForCurrentItem)) { val currentHeader = timeGroupForHistoryItem(current)
if (isPendingDeletion && itemsWithHeaders[headerForCurrentItem] == position) { val timeGroup = if (currentHeader != previousHeader) currentHeader else null
itemsWithHeaders.remove(headerForCurrentItem) holder.bind(current, timeGroup, position == 0, mode)
} 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
} }
companion object { companion object {

View File

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

View File

@ -30,8 +30,6 @@ sealed class HistoryFragmentAction : Action {
object ExitEditMode : HistoryFragmentAction() object ExitEditMode : HistoryFragmentAction()
data class AddItemForRemoval(val item: HistoryItem) : HistoryFragmentAction() data class AddItemForRemoval(val item: HistoryItem) : HistoryFragmentAction()
data class RemoveItemForRemoval(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 EnterDeletionMode : HistoryFragmentAction()
object ExitDeletionMode : HistoryFragmentAction() object ExitDeletionMode : HistoryFragmentAction()
object StartSync : HistoryFragmentAction() object StartSync : HistoryFragmentAction()
@ -43,16 +41,12 @@ sealed class HistoryFragmentAction : Action {
* @property items List of HistoryItem to display * @property items List of HistoryItem to display
* @property mode Current Mode of History * @property mode Current Mode of History
*/ */
data class HistoryFragmentState( data class HistoryFragmentState(val items: List<HistoryItem>, val mode: Mode) : State {
val items: List<HistoryItem>,
val mode: Mode,
val pendingDeletionIds: Set<Long>,
val isDeletingItems: Boolean
) : State {
sealed class Mode { sealed class Mode {
open val selectedItems = emptySet<HistoryItem>() open val selectedItems = emptySet<HistoryItem>()
object Normal : Mode() object Normal : Mode()
object Deleting : Mode()
object Syncing : Mode() object Syncing : Mode()
data class Editing(override val selectedItems: Set<HistoryItem>) : 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.ExitEditMode -> state.copy(mode = HistoryFragmentState.Mode.Normal)
is HistoryFragmentAction.EnterDeletionMode -> state.copy(isDeletingItems = true) is HistoryFragmentAction.EnterDeletionMode -> state.copy(mode = HistoryFragmentState.Mode.Deleting)
is HistoryFragmentAction.ExitDeletionMode -> state.copy(isDeletingItems = false) is HistoryFragmentAction.ExitDeletionMode -> state.copy(mode = HistoryFragmentState.Mode.Normal)
is HistoryFragmentAction.StartSync -> state.copy(mode = HistoryFragmentState.Mode.Syncing) is HistoryFragmentAction.StartSync -> state.copy(mode = HistoryFragmentState.Mode.Syncing)
is HistoryFragmentAction.FinishSync -> state.copy(mode = HistoryFragmentState.Mode.Normal) 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) val view: View = LayoutInflater.from(container.context)
.inflate(R.layout.component_history, container, true) .inflate(R.layout.component_history, container, true)
private var items: List<HistoryItem> = listOf()
var mode: HistoryFragmentState.Mode = HistoryFragmentState.Mode.Normal var mode: HistoryFragmentState.Mode = HistoryFragmentState.Mode.Normal
private set private set
@ -115,16 +116,13 @@ class HistoryView(
fun update(state: HistoryFragmentState) { fun update(state: HistoryFragmentState) {
val oldMode = mode 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.isRefreshing = state.mode === HistoryFragmentState.Mode.Syncing
view.swipe_refresh.isEnabled = view.swipe_refresh.isEnabled =
state.mode === HistoryFragmentState.Mode.Normal || state.mode === HistoryFragmentState.Mode.Syncing state.mode === HistoryFragmentState.Mode.Normal || state.mode === HistoryFragmentState.Mode.Syncing
items = state.items
mode = state.mode mode = state.mode
historyAdapter.updatePendingDeletionIds(state.pendingDeletionIds)
updateEmptyState(state.pendingDeletionIds.size != historyAdapter.currentList?.size)
historyAdapter.updateMode(state.mode) historyAdapter.updateMode(state.mode)
val first = layoutManager.findFirstVisibleItemPosition() val first = layoutManager.findFirstVisibleItemPosition()
val last = layoutManager.findLastVisibleItemPosition() + 1 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.R
import org.mozilla.fenix.ext.hideAndDisable import org.mozilla.fenix.ext.hideAndDisable
import org.mozilla.fenix.ext.showAndEnable import org.mozilla.fenix.ext.showAndEnable
import org.mozilla.fenix.utils.Do
import org.mozilla.fenix.library.SelectionHolder import org.mozilla.fenix.library.SelectionHolder
import org.mozilla.fenix.library.history.HistoryFragmentState import org.mozilla.fenix.library.history.HistoryFragmentState
import org.mozilla.fenix.library.history.HistoryInteractor import org.mozilla.fenix.library.history.HistoryInteractor
import org.mozilla.fenix.library.history.HistoryItem import org.mozilla.fenix.library.history.HistoryItem
import org.mozilla.fenix.library.history.HistoryItemMenu import org.mozilla.fenix.library.history.HistoryItemMenu
import org.mozilla.fenix.library.history.HistoryItemTimeGroup import org.mozilla.fenix.library.history.HistoryItemTimeGroup
import org.mozilla.fenix.utils.Do
class HistoryListItemViewHolder( class HistoryListItemViewHolder(
view: View, view: View,
@ -44,15 +44,8 @@ class HistoryListItemViewHolder(
item: HistoryItem, item: HistoryItem,
timeGroup: HistoryItemTimeGroup?, timeGroup: HistoryItemTimeGroup?,
showDeleteButton: Boolean, showDeleteButton: Boolean,
mode: HistoryFragmentState.Mode, mode: HistoryFragmentState.Mode
isPendingDeletion: Boolean = false
) { ) {
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.titleView.text = item.title
itemView.history_layout.urlView.text = item.url 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 { bottomPreference.onClickListener {
requireContext().components.analytics.metrics.track(Event.ToolbarPositionChanged( requireContext().components.analytics.metrics.track(Event.ToolbarPositionChanged(
Event.ToolbarPositionChanged.Position.BOTTOM 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.FenixSnackbar
import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.utils.Settings
@SuppressWarnings("TooManyFunctions") @SuppressWarnings("TooManyFunctions")
class DeleteBrowsingDataFragment : Fragment(R.layout.fragment_delete_browsing_data) { class DeleteBrowsingDataFragment : Fragment(R.layout.fragment_delete_browsing_data) {
private lateinit var controller: DeleteBrowsingDataController private lateinit var controller: DeleteBrowsingDataController
private var scope: CoroutineScope? = null private var scope: CoroutineScope? = null
private lateinit var settings: Settings
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
controller = DefaultDeleteBrowsingDataController(requireContext()) controller = DefaultDeleteBrowsingDataController(requireContext())
settings = requireContext().settings()
getCheckboxes().forEach { 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 { view.delete_data?.setOnClickListener {
askToDelete() 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 @ExperimentalCoroutinesApi
@ -138,10 +166,6 @@ class DeleteBrowsingDataFragment : Fragment(R.layout.fragment_delete_browsing_da
delete_browsing_data_wrapper.isClickable = true delete_browsing_data_wrapper.isClickable = true
delete_browsing_data_wrapper.alpha = ENABLED_ALPHA delete_browsing_data_wrapper.alpha = ENABLED_ALPHA
getCheckboxes().forEach {
it.isChecked = false
}
updateItemCounts() updateItemCounts()
FenixSnackbar.make( FenixSnackbar.make(

View File

@ -441,6 +441,31 @@ class Settings private constructor(
default = false 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( var shouldUseBottomToolbar by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_toolbar_bottom), appContext.getPreferenceKey(R.string.pref_key_toolbar_bottom),
// Default accessibility users to top toolbar // Default accessibility users to top toolbar

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!-- This Source Code Form is subject to the terms of the Mozilla Public
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this - License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
@ -7,12 +6,12 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"
android:layout_marginBottom="8dp"
android:background="?android:selectableItemBackground" android:background="?android:selectableItemBackground"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:gravity="center_vertical" android:gravity="center_vertical"
android:paddingStart="16dp" android:paddingStart="16dp"
android:layout_marginBottom="8dp"
android:paddingEnd="16dp"> android:paddingEnd="16dp">
<LinearLayout <LinearLayout
@ -29,6 +28,7 @@
android:id="@android:id/title" android:id="@android:id/title"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:textColor="@color/state_list_text_color" android:textColor="@color/state_list_text_color"
android:textSize="16sp" android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@android:id/summary" app:layout_constraintBottom_toTopOf="@android:id/summary"
@ -42,6 +42,7 @@
android:id="@android:id/summary" android:id="@android:id/summary"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:textColor="@color/secondary_state_list_text_color" android:textColor="@color/secondary_state_list_text_color"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="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_height="wrap_content"
android:layout_marginStart="@dimen/library_item_icon_margin_horizontal" android:layout_marginStart="@dimen/library_item_icon_margin_horizontal"
android:layout_marginEnd="@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:clickable="false"
android:textAppearance="@style/ListItemTextStyle" android:textAppearance="@style/ListItemTextStyle"
app:layout_constraintBottom_toTopOf="@id/subtitle" app:layout_constraintBottom_toTopOf="@id/subtitle"
@ -42,8 +44,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/library_item_icon_margin_horizontal" android:layout_marginStart="@dimen/library_item_icon_margin_horizontal"
android:layout_marginEnd="@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:clickable="false"
android:textAppearance="@style/SubtitleTextStyle" android:textColor="@color/secondary_state_list_text_color"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/checkbox" app:layout_constraintStart_toEndOf="@id/checkbox"

View File

@ -37,7 +37,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginTop="9dp" android:layout_marginTop="9dp"
android:layout_marginEnd="74dp"
android:ellipsize="end" android:ellipsize="end"
android:singleLine="true" android:singleLine="true"
android:textAppearance="@style/Body14TextStyle" 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> <string name="preferences_sync_bookmarks">Marcadores</string>
<!-- Preference for syncing logins --> <!-- Preference for syncing logins -->
<string name="preferences_sync_logins">Anicios de sesión</string> <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 --> <!-- Preference for signing out -->
<string name="preferences_sign_out">Zarrar sesión</string> <string name="preferences_sign_out">Zarrar sesión</string>
<!-- Preference displays and allows changing current FxA device name --> <!-- Preference displays and allows changing current FxA device name -->
@ -592,7 +594,9 @@
<!-- Collections header on home fragment --> <!-- Collections header on home fragment -->
<string name="collections_header">Coleiciones</string> <string name="collections_header">Coleiciones</string>
<!-- No Open Tabs Message Header --> <!-- 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 --> <!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">Esbilla de llingüetes</string> <string name="create_collection_select_tabs">Esbilla de llingüetes</string>
<!-- Title for the "select collection" step of the collection creator --> <!-- 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 --> <!-- Message for copying the URL via long press on the toolbar -->
<string name="url_copied">Copióse la URL</string> <string name="url_copied">Copióse la URL</string>
<!-- Sample text for accessibility font size --> <!-- 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 --> <!-- 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> <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 --> <!-- Title for Accessibility Text Size Scaling Preference -->
<string name="preference_accessibility_font_size_title">Tamañu de la fonte</string> <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 --> <!-- Title for the Delete browsing data preference -->
<string name="preferences_delete_browsing_data">Desaniciu de los datos de restolar</string> <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 --> <!-- 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> <string name="preferences_delete_browsing_data_tabs_subtitle">%d llingüetes</string>
<!-- Title for the data and history items in Delete browsing data --> <!-- Title for the data and history items in Delete browsing data -->
@ -831,8 +842,19 @@
<!-- text for the tracking protection onboarding card header --> <!-- text for the tracking protection onboarding card header -->
<string name="onboarding_tracking_protection_header_2">Privacidá automática</string> <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 --> <!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">Estricta (aconséyase)</string> <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 <!-- text for the toolbar position card header
In English this is an idiom for "choose a side as in an argument or fight" 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 --> 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> <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 --> <!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">Deprender más</string> <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 --> <!-- 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> <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 --> <!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">Estricta</string> <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 --> <!-- 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> <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 --> <!-- 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> <string name="etp_tracking_content_title">Conteníu que rastrexa</string>
<!-- Description of tracking content that can be blocked by Enhanced Tracking Protection --> <!-- 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> <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 --> <!-- Enhanced Tracking Protection message that protection is currently on for this site -->
<string name="etp_panel_on">ACTIVÓSE nesti sitiu</string> <string name="etp_panel_on">ACTIVÓSE nesti sitiu</string>
<!-- Enhanced Tracking Protection message that protection is currently off for this site --> <!-- 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 --> <!-- 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> <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. --> <!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Val, entendílo</string> <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"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <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 --> <!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Выдаліць сеанс</string> <string name="private_browsing_delete_session">Выдаліць сеанс</string>
@ -43,6 +46,10 @@
<string name="browser_menu_settings">Налады</string> <string name="browser_menu_settings">Налады</string>
<!-- Browser menu button that opens a user's library --> <!-- Browser menu button that opens a user's library -->
<string name="browser_menu_library">Бібліятэка</string> <string name="browser_menu_library">Бібліятэка</string>
<!-- Browser menu toggle that requests a desktop site -->
<string name="browser_menu_desktop_site">Версія для камп’ютара</string>
<!-- Browser menu toggle that adds a shortcut to the site on the device home screen. -->
<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. --> <!-- 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> <string name="browser_menu_install_on_homescreen">Усталяваць</string>
<!-- Menu option on the toolbar that takes you to synced tabs page--> <!-- Menu option on the toolbar that takes you to synced tabs page-->
@ -380,6 +387,8 @@
<string name="collection_menu_button_content_description">Меню калекцыі</string> <string name="collection_menu_button_content_description">Меню калекцыі</string>
<!-- No Open Tabs Message Header --> <!-- No Open Tabs Message Header -->
<string name="no_collections_header1">Збірайце важныя для вас рэчы</string> <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 --> <!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">Выберыце карткі</string> <string name="create_collection_select_tabs">Выберыце карткі</string>
<!-- Title for the "select collection" step of the collection creator --> <!-- Title for the "select collection" step of the collection creator -->
@ -486,4 +495,9 @@
<!-- Add button text for the Add to Homescreen dialog --> <!-- Add button text for the Add to Homescreen dialog -->
<string name="add_to_homescreen_add">Дадаць</string> <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> </resources>

View File

@ -31,9 +31,17 @@
<!-- Delete session button to erase your history in a private session --> <!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Obriši sesiju</string> <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 --> <!-- Text for the negative button -->
<string name="cfr_neg_button_text">Ne, hvala</string> <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 --> <!-- Text for the positive button -->
<string name="search_widget_cfr_pos_button_text">Dodaj widget</string> <string name="search_widget_cfr_pos_button_text">Dodaj widget</string>
<!-- Text for the negative button --> <!-- Text for the negative button -->
@ -45,6 +53,9 @@
<!-- Shortcut action to open new private tab --> <!-- Shortcut action to open new private tab -->
<string name="home_screen_shortcut_open_new_private_tab_2">Novi privatni tab</string> <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) --> <!-- Content description (not visible, for screen readers etc.): Navigate backward (browsing history) -->
<string name="browser_menu_back">Nazad</string> <string name="browser_menu_back">Nazad</string>
<!-- Content description (not visible, for screen readers etc.): Navigate forward (browsing history) --> <!-- Content description (not visible, for screen readers etc.): Navigate forward (browsing history) -->
@ -121,6 +132,8 @@
<!-- Search Fragment --> <!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code --> <!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Skeniraj</string> <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 --> <!-- 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> <string name="search_shortcuts_engine_settings">Postavke pretraživača</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine --> <!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
@ -133,6 +146,10 @@
<string name="search_suggestions_onboarding_allow_button">Dozvoli</string> <string name="search_suggestions_onboarding_allow_button">Dozvoli</string>
<!-- Button in the search suggestions onboarding that does not allow search suggestions in private sessions --> <!-- 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> <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 --> <!-- Search suggestion onboarding hint Learn more link text -->
<string name="search_suggestions_onboarding_learn_more_link">Saznajte više</string> <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 --> <!-- Preference link to rating Fenix on the Play Store -->
<string name="preferences_rate">Ocijenite na Google Play</string> <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 <!-- Preference linking to about page for Fenix
The first parameter is the name of the app defined in app_name (for example: 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> <string name="preferences_about">O %1$s</string>
@ -181,12 +200,22 @@
<string name="preferences_category_privacy">Privatnost</string> <string name="preferences_category_privacy">Privatnost</string>
<!-- Preference category for privacy and security settings --> <!-- Preference category for privacy and security settings -->
<string name="preferences_category_privacy_security">Privatnost i sigurnost</string> <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 --> <!-- Preference for private browsing options -->
<string name="preferences_private_browsing_options">Privatno surfanje</string> <string name="preferences_private_browsing_options">Privatno surfanje</string>
<!-- Preference for opening links in a private tab--> <!-- Preference for opening links in a private tab-->
<string name="preferences_open_links_in_a_private_tab">Otvaraj linkove u privatnom tabu</string> <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--> <!-- 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> <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 --> <!-- Preference category for account information -->
<string name="preferences_category_account">Račun</string> <string name="preferences_category_account">Račun</string>
<!-- Preference shown on banner to sign into account --> <!-- Preference shown on banner to sign into account -->
@ -197,13 +226,46 @@
<string name="preferences_theme">Tema</string> <string name="preferences_theme">Tema</string>
<!-- Preference for settings related to visual options --> <!-- Preference for settings related to visual options -->
<string name="preferences_customize">Prilagodi</string> <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. --> <!-- 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> <string name="preferences_account_default_name">Firefox račun</string>
<!-- Preference for language --> <!-- Preference for language -->
<string name="preferences_language">Jezik</string> <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 --> <!-- Preference for add_ons -->
<string name="preferences_addons">Add-oni</string> <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 --> <!-- Preference category for sync -->
<string name="preferences_sync_category">Izaberite šta ćete sinhronizovati</string> <string name="preferences_sync_category">Izaberite šta ćete sinhronizovati</string>
<!-- Preference for syncing history --> <!-- Preference for syncing history -->
@ -239,6 +301,12 @@
<!-- Send Tab --> <!-- Send Tab -->
<!-- Name of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app --> <!-- 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> <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 --> <!-- %s is the device name -->
<string name="fxa_tab_received_from_notification_name">Tab iz %s</string> <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 --> <!-- 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> <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 --> <!-- Preference switch for Telemetry -->
<string name="preferences_telemetry">Telemetrija</string> <string name="preferences_telemetry">Telemetrija</string>
<!-- Preference switch for usage and technical data collection --> <!-- Preference switch for usage and technical data collection -->
<string name="preference_usage_data">Tehnički i podaci o upotrebi</string> <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 --> <!-- Preference switch for marketing data collection -->
<string name="preferences_marketing_data">Marketinški podaci</string> <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 --> <!-- Title for experiments preferences -->
<string name="preference_experiments">Eksperimenti</string> <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 --> <!-- Preference switch for Mozilla location service -->
<string name="preferences_mozilla_location_service">Mozilla lokacijski servis</string> <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) --> <!-- 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 --> <!-- Option in Library to open History page -->
<string name="library_history">Historija</string> <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 --> <!-- Menu Item Label for Search in Library -->
<string name="library_search">Traži</string> <string name="library_search">Traži</string>
<!-- Settings Page Title --> <!-- Settings Page Title -->
@ -723,4 +804,344 @@
<!-- Title for the Delete browsing data on quit preference --> <!-- Title for the Delete browsing data on quit preference -->
<string name="preferences_delete_browsing_data_on_quit">Obriši podatke surfanja pri izlazu</string> <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> <string name="content_description_disable_private_browsing_button">Deaktiviraj privatno pregledavanje</string>
<!-- Placeholder text shown in the search bar before a user enters text --> <!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Traži ili upiši adresu</string> <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 --> <!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">Ovdje će se prikazati tvoje otvorene kartice.</string> <string name="no_open_tabs_description">Ovdje će se prikazati tvoje otvorene kartice.</string>
<!-- No Private Tabs Message Description --> <!-- No Private Tabs Message Description -->
<string name="no_private_tabs_description">Ovdje će se prikazati tvoje privatne kartice.</string> <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) --> <!-- About content. The first parameter is the name of the application. (For example: Fenix) -->
<string name="about_content">%1$s proizvodi Mozilla.</string> <string name="about_content">%1$s proizvodi Mozilla.</string>
@ -103,8 +106,6 @@
<string name="browser_menu_new_tab">Nova kartica</string> <string name="browser_menu_new_tab">Nova kartica</string>
<!-- Browser menu button that saves the current tab to a collection --> <!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">Spremi u zbirku</string> <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 --> <!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">Dijeli</string> <string name="browser_menu_share">Dijeli</string>
<!-- Share menu title, displayed when a user is sharing their current site --> <!-- 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 <!-- 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) --> 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> <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> <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 --> <!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">Otvori u aplikaciji</string> <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 --> <!-- Browser menu button to configure reader mode appearance e.g. the used font type and size -->
@ -292,7 +295,7 @@
<!-- Preference for syncing logins --> <!-- Preference for syncing logins -->
<string name="preferences_sync_logins">Prijave</string> <string name="preferences_sync_logins">Prijave</string>
<!-- Preference for syncing tabs --> <!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs">Kartice</string> <string name="preferences_sync_tabs_2">Otvorene kartice</string>
<!-- Preference for signing out --> <!-- Preference for signing out -->
<string name="preferences_sign_out">Odjavi se</string> <string name="preferences_sign_out">Odjavi se</string>
<!-- Preference displays and allows changing current FxA device name --> <!-- Preference displays and allows changing current FxA device name -->
@ -451,6 +454,24 @@
<string name="tabs_header_private_tabs_title">Privatne kartice</string> <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 --> <!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_tab">Dodaj karticu</string> <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 --> <!-- 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> <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 --> <!-- 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 --> <!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">Dijeli kartice</string> <string name="tabs_menu_share_tabs">Dijeli kartice</string>
<!-- Open tabs menu item to save tabs to collection --> <!-- 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 --> <!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">Izbornik za kartice</string> <string name="tab_menu">Izbornik za kartice</string>
<!-- Tab menu item to share the tab --> <!-- Tab menu item to share the tab -->
@ -681,17 +702,15 @@
<string name="delete_browsing_data_quit_off">Isključeno</string> <string name="delete_browsing_data_quit_off">Isključeno</string>
<!-- Collections --> <!-- 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 --> <!-- Collections header on home fragment -->
<string name="collections_header">Zbirke</string> <string name="collections_header">Zbirke</string>
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed --> <!-- 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> <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 --> <!-- No Open Tabs Message Header -->
<string name="no_collections_description">Tvoje zbirke će se prikazati ovdje.</string> <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 --> <!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">Odaberi kartice</string> <string name="create_collection_select_tabs">Odaberi kartice</string>
<!-- Title for the "select collection" step of the collection creator --> <!-- 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--> <!-- Button to save currently selected tabs in the "select tabs" step of the collection creator-->
<string name="create_collection_save">Spremi</string> <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--> <!-- 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> <string name="create_collection_default_name">Zbirka %d</string>
@ -895,8 +917,9 @@
<!-- text for firefox preview moving tip description --> <!-- 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. <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>         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 --> <!-- 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> <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> <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 --> <!-- 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> <string name="onboarding_firefox_account_automatic_signin_failed">Neuspjela prijava</string>
<!-- text for the tracking protection onboarding card header --> <!-- 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 <!-- text for the tracking protection card description
The first parameter is the name of the app (e.g. Firefox Preview) --> 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 --> <!-- 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 --> <!-- 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 --> <!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">Strogo (preporučeno)</string> <string name="onboarding_tracking_protection_strict_button">Strogo (preporučeno)</string>
<!-- text for tracking protection radio button option for strict level of blocking --> <!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_option">Strogo</string> <string name="onboarding_tracking_protection_strict_option">Strogo</string>
<!-- text for strict blocking option button description --> <!-- 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 <!-- text for the toolbar position card header
In English this is an idiom for "choose a side as in an argument or fight" 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 --> 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 --> <!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">Saznaj više</string> <string name="preference_enhanced_tracking_protection_explanation_learn_more">Saznaj više</string>
<!-- Preference for enhanced tracking protection for the standard protection settings --> <!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_option">Standardno</string> <string name="preference_enhanced_tracking_protection_standard_default_1">Standardno (zadano)</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard">Standardno (preporučeno)</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings --> <!-- 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> <string name="preference_enhanced_tracking_protection_standard_description_3">Blokira manje softvera za praćenje. Stranice se učitavaju normalno.</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>
<!-- Accessibility text for the Standard protection information icon --> <!-- 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> <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 --> <!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">Strogo</string> <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 --> <!-- 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> <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>
<!-- 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>
<!-- Accessibility text for the Strict protection information icon --> <!-- 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> <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 --> <!-- Preference for enhanced tracking protection for the custom protection settings -->
<string name="preference_enhanced_tracking_protection_custom">Prilagođeno</string> <string name="preference_enhanced_tracking_protection_custom">Prilagođeno</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings --> <!-- 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 --> <!-- 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> <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 --> <!-- 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> <string name="etp_tracking_content_title">Praćenje sadržaja</string>
<!-- Description of tracking content that can be blocked by Enhanced Tracking Protection --> <!-- 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> <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 --> <!-- 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> <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 --> <!-- 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 --> <!-- Voice search prompt description displayed after the user presses the voice search button -->
<string name="voice_search_explainer">Govorite sada</string> <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 --> <!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account --> <!-- 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> <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 --> <!-- Text displayed when user has disabled tab syncing in Firefox Sync Account -->
<string name="synced_tabs_enable_tab_syncing">Omogućite sinkroniziranje kartica.</string> <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> </resources>

View File

@ -14,8 +14,6 @@
<string name="content_description_disable_private_browsing_button">Zakázať súkromné prehliadanie</string> <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 --> <!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Hľadať</string> <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 --> <!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">Vaše otvorené karty budú zobrazené tu.</string> <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> <string name="browser_menu_new_tab">Nová karta</string>
<!-- Browser menu button that saves the current tab to a collection --> <!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">Uložiť do kolekcie</string> <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 --> <!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">Zdieľať</string> <string name="browser_menu_share">Zdieľať</string>
<!-- Share menu title, displayed when a user is sharing their current site --> <!-- 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) --> 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> <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> <string name="browser_menu_read">Zobrazenie Čítačka</string>
<!-- Browser menu button to open the current page in an external app --> <!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">Otvoriť v aplikácii</string> <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> <string name="preferences_sync_bookmarks">Záložky</string>
<!-- Preference for syncing logins --> <!-- Preference for syncing logins -->
<string name="preferences_sync_logins">Prihlasovacie údaje</string> <string name="preferences_sync_logins">Prihlasovacie údaje</string>
<!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs">Karty</string>
<!-- Preference for signing out --> <!-- Preference for signing out -->
<string name="preferences_sign_out">Odhlásiť sa</string> <string name="preferences_sign_out">Odhlásiť sa</string>
<!-- Preference displays and allows changing current FxA device name --> <!-- Preference displays and allows changing current FxA device name -->
@ -456,6 +450,8 @@
<string name="tabs_header_private_tabs_title">Súkromné karty</string> <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 --> <!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_tab">Pridať kartu</string> <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 --> <!-- 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> <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 --> <!-- 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> <string name="tabs_menu_close_all_tabs">Zavrieť všetky karty</string>
<!-- Open tabs menu item to share all tabs --> <!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">Zdieľať karty</string> <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 --> <!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">Ponuka kariet</string> <string name="tab_menu">Ponuka kariet</string>
<!-- Tab menu item to share the tab --> <!-- Tab menu item to share the tab -->
@ -683,16 +677,10 @@
<string name="delete_browsing_data_quit_off">Vypnuté</string> <string name="delete_browsing_data_quit_off">Vypnuté</string>
<!-- Collections --> <!-- 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 --> <!-- Collections header on home fragment -->
<string name="collections_header">Kolekcie</string> <string name="collections_header">Kolekcie</string>
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed --> <!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed -->
<string name="collection_menu_button_content_description">Ponuka kolekcií</string> <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 --> <!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">Výber kariet</string> <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--> <!-- Button to save currently selected tabs in the "select tabs" step of the collection creator-->
<string name="create_collection_save">Uložiť</string> <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--> <!-- 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> <string name="create_collection_default_name">Kolekcia %d</string>
@ -899,8 +890,6 @@
<!-- text for firefox preview moving tip description --> <!-- 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. <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> 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 --> <!-- 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> <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> <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 --> <!-- 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> <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 --> <!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">Prísna (odporúčaná)</string> <string name="onboarding_tracking_protection_strict_button">Prísna (odporúčaná)</string>
<!-- text for tracking protection radio button option for strict level of blocking --> <!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_option">Prísna</string> <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 <!-- text for the toolbar position card header
In English this is an idiom for "choose a side as in an argument or fight" 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 --> 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> <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 --> <!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">Ďalšie informácie</string> <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 --> <!-- 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> <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 --> <!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">Prísna</string> <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 --> <!-- 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> <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 --> <!-- Preference for enhanced tracking protection for the custom protection settings -->
<string name="preference_enhanced_tracking_protection_custom">Vlastná</string> <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 --> <!-- 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> <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 --> <!-- 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> <string name="etp_tracking_content_title">Sledovací obsah</string>
<!-- Description of tracking content that can be blocked by Enhanced Tracking Protection --> <!-- 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> <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 --> <!-- 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> <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 --> <!-- 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 --> <!-- 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> <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> </resources>

View File

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

View File

@ -13,8 +13,6 @@
<string name="content_description_disable_private_browsing_button">ปิดใช้งานการเรียกดูแบบส่วนตัว</string> <string name="content_description_disable_private_browsing_button">ปิดใช้งานการเรียกดูแบบส่วนตัว</string>
<!-- Placeholder text shown in the search bar before a user enters text --> <!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">ค้นหาหรือป้อนที่อยู่</string> <string name="search_hint">ค้นหาหรือป้อนที่อยู่</string>
<!-- No Open Tabs Message Header -->
<string name="no_open_tabs_header_2">ไม่มีแท็บที่เปิดอยู่</string>
<!-- No Open Tabs Message Description --> <!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">แท็บที่คุณเปิดจะถูกแสดงที่นี่</string> <string name="no_open_tabs_description">แท็บที่คุณเปิดจะถูกแสดงที่นี่</string>
@ -104,8 +102,6 @@
<string name="browser_menu_new_tab">แท็บใหม่</string> <string name="browser_menu_new_tab">แท็บใหม่</string>
<!-- Browser menu button that saves the current tab to a collection --> <!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">บันทึกไปยังชุดสะสม</string> <string name="browser_menu_save_to_collection_2">บันทึกไปยังชุดสะสม</string>
<!-- Browser menu button that opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">รายงานปัญหาไซต์</string>
<!-- Browser menu button that open a share menu to share the current site --> <!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">แบ่งปัน</string> <string name="browser_menu_share">แบ่งปัน</string>
<!-- Share menu title, displayed when a user is sharing their current site --> <!-- 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 <!-- 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) --> 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> <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> <string name="browser_menu_read">มุมมองผู้อ่าน</string>
<!-- Browser menu button to open the current page in an external app --> <!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">เปิดในแอป</string> <string name="browser_menu_open_app_link">เปิดในแอป</string>
@ -293,7 +289,7 @@
<!-- Preference for syncing logins --> <!-- Preference for syncing logins -->
<string name="preferences_sync_logins">การเข้าสู่ระบบ</string> <string name="preferences_sync_logins">การเข้าสู่ระบบ</string>
<!-- Preference for syncing tabs --> <!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs">แท็บ</string> <string name="preferences_sync_tabs_2">แท็บที่เปิดอยู่</string>
<!-- Preference for signing out --> <!-- Preference for signing out -->
<string name="preferences_sign_out">ลงชื่อออก</string> <string name="preferences_sign_out">ลงชื่อออก</string>
<!-- Preference displays and allows changing current FxA device name --> <!-- Preference displays and allows changing current FxA device name -->
@ -460,8 +456,6 @@
<string name="tabs_menu_close_all_tabs">ปิดแท็บทั้งหมด</string> <string name="tabs_menu_close_all_tabs">ปิดแท็บทั้งหมด</string>
<!-- Open tabs menu item to share all tabs --> <!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">แบ่งปันแท็บ</string> <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 --> <!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">เมนูแท็บ</string> <string name="tab_menu">เมนูแท็บ</string>
<!-- Tab menu item to share the tab --> <!-- Tab menu item to share the tab -->
@ -673,17 +667,10 @@
<string name="delete_browsing_data_quit_off">ปิด</string> <string name="delete_browsing_data_quit_off">ปิด</string>
<!-- Collections --> <!-- Collections -->
<!-- Label to describe what collections are to a new user without any collections -->
<string name="collections_description">รวบรวมสิ่งที่สำคัญสำหรับคุณ เมื่อต้องการเริ่มต้น ให้บันทึกแท็บที่เปิดอยู่ไปยังชุดสะสมใหม่</string>
<!-- Collections header on home fragment --> <!-- Collections header on home fragment -->
<string name="collections_header">ชุดสะสม</string> <string name="collections_header">ชุดสะสม</string>
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed --> <!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed -->
<string name="collection_menu_button_content_description">เมนูชุดสะสม</string> <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 --> <!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">เลือกแท็บ</string> <string name="create_collection_select_tabs">เลือกแท็บ</string>
<!-- Title for the "select collection" step of the collection creator --> <!-- Title for the "select collection" step of the collection creator -->
@ -887,8 +874,6 @@
<!-- text for firefox preview moving tip description --> <!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description">Firefox Nightly อัปเดตทุกคืนและมีลูกเล่นใหม่ ๆ ทุกคืน <string name="tip_firefox_preview_moved_description">Firefox Nightly อัปเดตทุกคืนและมีลูกเล่นใหม่ ๆ ทุกคืน
        อย่างไรก็ตามความเสถียรอาจลดลง ดาวน์โหลดเบราว์เซอร์เบต้าของเราเพื่อประสบการณ์ที่เสถียรยิ่งขึ้น</string>         อย่างไรก็ตามความเสถียรอาจลดลง ดาวน์โหลดเบราว์เซอร์เบต้าของเราเพื่อประสบการณ์ที่เสถียรยิ่งขึ้น</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 --> <!-- text for firefox preview moving tip header. "Firefox Nightly" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header_preview_installed">Firefox Nightly ย้ายไปแล้ว</string> <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> <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 --> <!-- text to display in the snackbar if automatic sign-in fails. user may try again -->
<string name="onboarding_firefox_account_automatic_signin_failed">ไม่สามารถเข้าสู่ระบบ</string> <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 --> <!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">เข้มงวด (แนะนำ)</string> <string name="onboarding_tracking_protection_strict_button">เข้มงวด (แนะนำ)</string>
<!-- text for tracking protection radio button option for strict level of blocking --> <!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_option">เข้มงวด</string> <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 <!-- text for the toolbar position card header
In English this is an idiom for "choose a side as in an argument or fight" 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 --> 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> <string name="preference_enhanced_tracking_protection_explanation">เก็บข้อมูลของคุณไว้กับตัวคุณเอง %s ปกป้องคุณจากตัวติดตามที่พบบ่อยที่สุดซึ่งติดตามสิ่งที่คุณทำทางออนไลน์</string>
<!-- Text displayed that links to website about enhanced tracking protection --> <!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">เรียนรู้เพิ่มเติม</string> <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 --> <!-- Accessibility text for the Standard protection information icon -->
<string name="preference_enhanced_tracking_protection_standard_info_button">สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบมาตรฐาน</string> <string name="preference_enhanced_tracking_protection_standard_info_button">สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบมาตรฐาน</string>
<!-- Preference for enhanced tracking protection for the strict protection settings --> <!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">เข้มงวด</string> <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 --> <!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_strict_info_button">สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบเข้มงวด</string> <string name="preference_enhanced_tracking_protection_strict_info_button">สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบเข้มงวด</string>
<!-- Preference for enhanced tracking protection for the custom protection settings --> <!-- Preference for enhanced tracking protection for the custom protection settings -->
<string name="preference_enhanced_tracking_protection_custom">กำหนดเอง</string> <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 --> <!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_custom_info_button">สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบกำหนดเอง</string> <string name="preference_enhanced_tracking_protection_custom_info_button">สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบกำหนดเอง</string>
<!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings --> <!-- 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 --> <!-- Description of tracking content that can be blocked by Enhanced Tracking Protection -->
<string name="etp_tracking_content_description">หยุดไม่ให้โหลดโฆษณาภายนอก, วิดีโอ, และเนื้อหาอื่น ๆ ที่มีรหัสการติดตาม อาจส่งผลต่อฟังก์ชันการทำงานของบางเว็บไซต์</string> <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 --> <!-- Enhanced Tracking Protection message that protection is currently on for this site -->
<string name="etp_panel_on">การป้องกันถูก เปิด สำหรับไซต์นี้</string> <string name="etp_panel_on">การป้องกันถูก เปิด สำหรับไซต์นี้</string>
<!-- Enhanced Tracking Protection message that protection is currently off for this site --> <!-- 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> <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 --> <!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">เชื่อมต่ออุปกรณ์อื่น</string> <string name="synced_tabs_connect_another_device">เชื่อมต่ออุปกรณ์อื่น</string>
</resources> </resources>

View File

@ -1438,6 +1438,8 @@
<!-- Top Sites --> <!-- Top Sites -->
<!-- Title text displayed in the dialog when top sites limit is reached. --> <!-- 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> <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. --> <!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Tamam</string> <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 --> <!-- 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> <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 --> <!-- Content description (not visible, for screen readers etc.): Close onboarding screen -->
<string name="onboarding_close">Nārán</string> <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_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_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_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_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_last_known_mode_private" translatable="false">pref_key_last_known_mode_private</string>
<string name="pref_key_addons" translatable="false">pref_key_addons</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> <string name="bookmark_select_folder">Select folder</string>
<!-- Confirmation message for a dialog confirming if the user wants to delete the selected folder --> <!-- 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> <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 --> <!-- 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> <string name="bookmark_delete_folder_snackbar">Deleted %1$s</string>
<!-- Screen title for adding a bookmarks folder --> <!-- Screen title for adding a bookmarks folder -->
@ -622,10 +620,8 @@
<!-- Bookmark snackbar message on deletion <!-- Bookmark snackbar message on deletion
The first parameter is the host part of the URL of the bookmark deleted, if any --> 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> <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> <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 --> <!-- Bookmark undo button for deletion snackbar action -->
<string name="bookmark_undo_deletion">UNDO</string> <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> <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. --> <!-- 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> <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 --> <!-- Action item in menu for the Delete browsing data on quit feature -->
<string name="delete_browsing_data_on_quit_action">Quit</string> <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" <androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<SwitchPreference <SwitchPreference
app:iconSpaceReserved="false"
android:defaultValue="false" android:defaultValue="false"
android:key="@string/pref_key_delete_browsing_data_on_quit" android:key="@string/pref_key_delete_browsing_data_on_quit"
android:summary="@string/preference_summary_delete_browsing_data_on_quit_2" 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" android:key="@string/pref_key_delete_browsing_data_on_quit_categories"
app:allowDividerAbove="false" app:allowDividerAbove="false"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
android:layout="@layout/preference_cat_style"> android:layout="@layout/preference_category_empty">
<CheckBoxPreference <CheckBoxPreference
android:key="@string/pref_key_delete_open_tabs_on_quit" 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" /> android:title="@string/preferences_delete_browsing_data_tabs_title_2" />
<CheckBoxPreference <CheckBoxPreference
android:key="@string/pref_key_delete_browsing_history_on_quit" android:key="@string/pref_key_delete_browsing_history_on_quit"
android:layout="@layout/delete_browsing_category_checkbox" android:layout="@layout/checkbox_left_preference"
android:title="@string/preferences_delete_browsing_data_on_quit_browsing_history" /> android:title="@string/preferences_delete_browsing_data_browsing_data_title" />
<CheckBoxPreference <CheckBoxPreference
android:key="@string/pref_key_delete_cookies_on_quit" 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:summary="@string/preferences_delete_browsing_data_cookies_subtitle"
android:title="@string/preferences_delete_browsing_data_cookies" /> android:title="@string/preferences_delete_browsing_data_cookies" />
<CheckBoxPreference <CheckBoxPreference
android:key="@string/pref_key_delete_caches_on_quit" 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:summary="@string/preferences_delete_browsing_data_cached_files_subtitle"
android:title="@string/preferences_delete_browsing_data_cached_files" /> android:title="@string/preferences_delete_browsing_data_cached_files" />
<CheckBoxPreference <CheckBoxPreference
android:key="@string/pref_key_delete_permissions_on_quit" 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" /> android:title="@string/preferences_delete_browsing_data_site_permissions" />
</PreferenceCategory> </PreferenceCategory>
</androidx.preference.PreferenceScreen> </androidx.preference.PreferenceScreen>

View File

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

View File

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

View File

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