1
0
Fork 0

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

master
blallo 2020-06-23 00:00:31 +02:00
commit af499e9340
50 changed files with 1530 additions and 368 deletions

View File

@ -443,7 +443,7 @@ class BookmarksTest {
confirmFolderDeletion()
verifyDeleteSnackBarText()
verifyFolderTitle("3")
}.goBack {
}.closeMenu {
}
homeScreen {
@ -525,4 +525,14 @@ class BookmarksTest {
verifySelectDefaultFolderSnackBarText()
}
}
@Test
fun verifyCloseMenu() {
homeScreen {
}.openThreeDotMenu {
}.openBookmarks {
}.closeMenu {
verifyHomeScreen()
}
}
}

View File

@ -293,11 +293,11 @@ class HistoryTest {
}
@Test
fun verifyBackNavigation() {
fun verifyCloseMenu() {
homeScreen {
}.openThreeDotMenu {
}.openHistory {
}.goBack {
}.closeMenu {
verifyHomeScreen()
}
}

View File

@ -72,7 +72,7 @@ class ThreeDotMenuMainTest {
}.openThreeDotMenu {
}.openBookmarks {
verifyBookmarksMenuView()
}.goBack {
}.closeMenu {
}
homeScreen {

View File

@ -113,7 +113,8 @@ class BookmarksRobot {
.check(matches(isDisplayed()))
}
fun verifySignInToSyncButton() = signInToSyncButton().check(matches(isDisplayed()))
fun verifySignInToSyncButton() =
signInToSyncButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
fun verifyDeleteFolderConfirmationMessage() = assertDeleteFolderConfirmationMessage()
@ -180,11 +181,11 @@ class BookmarksRobot {
}
class Transition {
fun goBack(interact: HomeScreenRobot.() -> Unit): HomeScreenRobot.Transition {
goBackButton().click()
fun closeMenu(interact: HomeScreenRobot.() -> Unit): Transition {
closeButton().click()
HomeScreenRobot().interact()
return HomeScreenRobot.Transition()
return Transition()
}
fun openThreeDotMenu(interact: ThreeDotMenuBookmarksRobot.() -> Unit): ThreeDotMenuBookmarksRobot.Transition {
@ -224,6 +225,8 @@ fun bookmarksMenu(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transitio
return BookmarksRobot.Transition()
}
private fun closeButton() = onView(withId(R.id.close_bookmarks))
private fun goBackButton() = onView(withContentDescription("Navigate up"))
private fun bookmarkFavicon(url: String) = onView(

View File

@ -10,7 +10,6 @@ import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.RootMatchers.isDialog
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withParent
@ -84,8 +83,8 @@ class HistoryRobot {
}
class Transition {
fun goBack(interact: HistoryRobot.() -> Unit): Transition {
goBackButton().click()
fun closeMenu(interact: HistoryRobot.() -> Unit): Transition {
closeButton().click()
HistoryRobot().interact()
return Transition()
@ -107,7 +106,7 @@ fun historyMenu(interact: HistoryRobot.() -> Unit): HistoryRobot.Transition {
return HistoryRobot.Transition()
}
private fun goBackButton() = onView(withContentDescription("Navigate up"))
private fun closeButton() = onView(withId(R.id.close_history))
private fun testPageTitle() = onView(allOf(withId(R.id.title), withText("Test_Page_1")))

View File

@ -128,6 +128,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity() {
)
}
private lateinit var navigationToolbar: Toolbar
final override fun onCreate(savedInstanceState: Bundle?) {
StrictModeManager.changeStrictModePolicies(supportFragmentManager)
// There is disk read violations on some devices such as samsung and pixel for android 9/10
@ -154,7 +156,9 @@ open class HomeActivity : LocaleAwareAppCompatActivity() {
sessionObserver = UriOpenedObserver(this)
externalSourceIntentProcessors.any { it.process(intent, navHost.navController, this.intent) }
if (isActivityColdStarted(intent, savedInstanceState)) {
externalSourceIntentProcessors.any { it.process(intent, navHost.navController, this.intent) }
}
Performance.processIntentIfPerformanceTest(intent, this)
@ -196,8 +200,6 @@ open class HomeActivity : LocaleAwareAppCompatActivity() {
final override fun onPause() {
if (settings().lastKnownMode.isPrivate) {
window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
} else {
window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
super.onPause()
@ -329,24 +331,29 @@ open class HomeActivity : LocaleAwareAppCompatActivity() {
fun getSupportActionBarAndInflateIfNecessary(): ActionBar {
// Add ids to this that we don't want to have a toolbar back button
if (!isToolbarInflated) {
val navigationToolbar = navigationToolbarStub.inflate() as Toolbar
navigationToolbar = navigationToolbarStub.inflate() as Toolbar
setSupportActionBar(navigationToolbar)
NavigationUI.setupWithNavController(
navigationToolbar,
navHost.navController,
AppBarConfiguration.Builder().build()
)
navigationToolbar.setNavigationOnClickListener {
onBackPressed()
}
setupNavigationToolbar()
isToolbarInflated = true
}
return supportActionBar!!
}
@Suppress("SpreadOperator")
fun setupNavigationToolbar(vararg topLevelDestinationIds: Int) {
NavigationUI.setupWithNavController(
navigationToolbar,
navHost.navController,
AppBarConfiguration.Builder(*topLevelDestinationIds).build()
)
navigationToolbar.setNavigationOnClickListener {
onBackPressed()
}
}
protected open fun getIntentSessionId(intent: SafeIntent): String? = null
@Suppress("LongParameterList")
@ -478,6 +485,15 @@ open class HomeActivity : LocaleAwareAppCompatActivity() {
this.visualCompletenessQueue = visualCompletenessQueue
}
@VisibleForTesting
internal fun isActivityColdStarted(startingIntent: Intent, activityIcicle: Bundle?): Boolean =
// First time opening this activity in the task.
// Cold start / start from Recents after back press.
activityIcicle == null &&
// Activity was restarted from Recents after it was destroyed by Android while in background
// in cases of memory pressure / "Don't keep activities".
startingIntent.flags and Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY == 0
companion object {
const val OPEN_TO_BROWSER = "open_to_browser"
const val OPEN_TO_BROWSER_AND_LOAD = "open_to_browser_and_load"

View File

@ -302,7 +302,7 @@ class DefaultToolbarMenu(
private val openInApp = BrowserMenuHighlightableItem(
label = context.getString(R.string.browser_menu_open_app_link),
startImageResource = R.drawable.ic_app_links,
startImageResource = R.drawable.ic_open_in_app,
iconTintColorResource = primaryTextColor(),
highlight = BrowserMenuHighlight.LowPriority(
label = context.getString(R.string.browser_menu_open_app_link),

View File

@ -139,7 +139,7 @@ class CustomTabToolbarMenu(
private val openInApp = BrowserMenuHighlightableItem(
label = context.getString(R.string.browser_menu_open_app_link),
startImageResource = R.drawable.ic_app_links,
startImageResource = R.drawable.ic_open_in_app,
iconTintColorResource = primaryTextColor(),
highlight = BrowserMenuHighlight.LowPriority(
label = context.getString(R.string.browser_menu_open_app_link),

View File

@ -10,7 +10,6 @@ import android.view.ContextThemeWrapper
import android.view.View
import android.view.ViewGroup
import androidx.annotation.StringRes
import androidx.fragment.app.FragmentActivity
import mozilla.components.browser.search.SearchEngineManager
import mozilla.components.support.locale.LocaleManager
import org.mozilla.fenix.BuildConfig
@ -50,9 +49,6 @@ val Context.searchEngineManager: SearchEngineManager
fun Context.asActivity() = (this as? ContextThemeWrapper)?.baseContext as? Activity
?: this as? Activity
fun Context.asFragmentActivity() = (this as? ContextThemeWrapper)?.baseContext as? FragmentActivity
?: this as? FragmentActivity
fun Context.getPreferenceKey(@StringRes resourceId: Int): String =
resources.getString(resourceId)

View File

@ -57,14 +57,12 @@ fun Fragment.hideToolbar() {
/**
* Pops the backstack to force users to re-auth if they put the app in the background and return to it
* while being inside the saved logins flow
* It also updates the FLAG_SECURE status for the activity's window
*
* Does nothing if the user is currently navigating to any of the [destinations] given as a parameter
*
*/
fun Fragment.redirectToReAuth(destinations: List<Int>, currentDestination: Int?) {
if (currentDestination !in destinations) {
activity?.let { it.checkAndUpdateScreenshotPermission(it.settings()) }
findNavController().popBackStack(R.id.savedLoginsAuthFragment, false)
}
}

View File

@ -115,7 +115,7 @@ class HomeMenu(
val addons = BrowserMenuImageText(
context.getString(R.string.browser_menu_add_ons),
R.drawable.mozac_ic_extensions,
R.drawable.ic_addons_extensions,
primaryTextColor
) {
onItemTapped.invoke(Item.AddonsManager)

View File

@ -7,6 +7,7 @@ package org.mozilla.fenix.library
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import mozilla.components.support.ktx.android.content.getColorFromAttr
import androidx.navigation.fragment.findNavController
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
@ -18,6 +19,12 @@ abstract class LibraryPageFragment<T> : Fragment() {
abstract val selectedItems: Set<T>
protected fun close() {
if (!findNavController().popBackStack(R.id.browserFragment, false)) {
findNavController().popBackStack(R.id.homeFragment, false)
}
}
protected fun openItemsInNewTab(private: Boolean = false, toUrl: (T) -> String?) {
context?.components?.useCases?.tabsUseCases?.let { tabsUseCases ->
val addTab = if (private) tabsUseCases.addPrivateTab else tabsUseCases.addTab

View File

@ -18,6 +18,7 @@ import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavDirections
import androidx.navigation.fragment.findNavController
import kotlinx.android.synthetic.main.component_bookmark.view.*
import kotlinx.android.synthetic.main.fragment_bookmark.view.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers.IO
@ -57,7 +58,6 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan
private lateinit var bookmarkStore: BookmarkFragmentStore
private lateinit var bookmarkView: BookmarkView
private lateinit var signInView: SignInView
private var _bookmarkInteractor: BookmarkFragmentInteractor? = null
protected val bookmarkInteractor: BookmarkFragmentInteractor
get() = _bookmarkInteractor!!
@ -97,9 +97,8 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan
metrics = metrics!!
)
bookmarkView = BookmarkView(view.bookmarkLayout, bookmarkInteractor)
signInView = SignInView(view.bookmarkLayout, findNavController())
signInView.view.visibility = View.GONE
bookmarkView = BookmarkView(view.bookmarkLayout, bookmarkInteractor, findNavController())
bookmarkView.view.bookmark_folders_sign_in.visibility = View.GONE
viewLifecycleOwner.lifecycle.addObserver(
BookmarkDeselectNavigationListener(
@ -150,9 +149,9 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan
if (currentGuid == BookmarkRoot.Root.id &&
requireComponents.backgroundServices.accountManager.authenticatedAccount() == null
) {
signInView.view.visibility = View.VISIBLE
bookmarkView.view.bookmark_folders_sign_in.visibility = View.VISIBLE
} else {
signInView.view.visibility = View.GONE
bookmarkView.view.bookmark_folders_sign_in.visibility = View.GONE
}
initialJob = loadInitialBookmarkFolder(currentGuid)
@ -192,6 +191,11 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.close_bookmarks -> {
invokePendingDeletion()
close()
true
}
R.id.add_bookmark_folder -> {
navigate(
BookmarkFragmentDirections

View File

@ -8,11 +8,14 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.navigation.NavController
import kotlinx.android.synthetic.main.component_bookmark.view.*
import mozilla.appservices.places.BookmarkRoot
import mozilla.components.concept.storage.BookmarkNode
import mozilla.components.support.base.feature.UserInteractionHandler
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.NavGraphDirections
import org.mozilla.fenix.library.LibraryPageView
import org.mozilla.fenix.library.SelectionInteractor
@ -94,7 +97,8 @@ interface BookmarkViewInteractor : SelectionInteractor<BookmarkNode> {
class BookmarkView(
container: ViewGroup,
val interactor: BookmarkViewInteractor
val interactor: BookmarkViewInteractor,
private val navController: NavController
) : LibraryPageView(container), UserInteractionHandler {
val view: View = LayoutInflater.from(container.context)
@ -111,6 +115,9 @@ class BookmarkView(
bookmarkAdapter = BookmarkAdapter(view.bookmarks_empty_view, interactor)
adapter = bookmarkAdapter
}
view.bookmark_folders_sign_in.setOnClickListener {
navController.navigate(NavGraphDirections.actionGlobalTurnOnSync())
}
}
fun update(state: BookmarkFragmentState) {
@ -123,12 +130,25 @@ class BookmarkView(
bookmarkAdapter.updateData(state.tree, mode)
when (mode) {
is BookmarkFragmentState.Mode.Normal ->
is BookmarkFragmentState.Mode.Normal -> {
if (tree != null) {
if (BookmarkRoot.Mobile.id == tree?.guid) {
(activity as HomeActivity).setupNavigationToolbar(R.id.bookmarkFragment)
} else {
(activity as HomeActivity).setupNavigationToolbar()
}
}
setUiForNormalMode(state.tree)
is BookmarkFragmentState.Mode.Selecting ->
}
is BookmarkFragmentState.Mode.Selecting -> {
(activity as HomeActivity).setupNavigationToolbar()
setUiForSelectingMode(
context.getString(R.string.bookmarks_multi_select_title, mode.selectedItems.size)
context.getString(
R.string.bookmarks_multi_select_title,
mode.selectedItems.size
)
)
}
}
view.bookmarks_progress_bar.isVisible = state.isLoading
}

View File

@ -1,31 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.library.bookmarks
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.NavController
import com.google.android.material.button.MaterialButton
import kotlinx.android.extensions.LayoutContainer
import org.mozilla.fenix.NavGraphDirections
import org.mozilla.fenix.R
class SignInView(
private val container: ViewGroup,
private val navController: NavController
) : LayoutContainer {
override val containerView: View?
get() = container
val view: MaterialButton = LayoutInflater.from(container.context)
.inflate(R.layout.component_sign_in, container, true)
.findViewById(R.id.bookmark_folders_sign_in)
init {
view.setOnClickListener { navController.navigate(NavGraphDirections.actionGlobalTurnOnSync()) }
}
}

View File

@ -155,6 +155,10 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), UserInteractionHandl
}
override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
R.id.close_history -> {
close()
true
}
R.id.share_history_multi_select -> {
val selectedHistory = historyStore.state.mode.selectedItems
val shareTabs = selectedHistory.map { ShareData(url = it.url, title = it.title) }

View File

@ -13,6 +13,7 @@ import androidx.recyclerview.widget.SimpleItemAnimator
import kotlinx.android.synthetic.main.component_history.*
import kotlinx.android.synthetic.main.component_history.view.*
import mozilla.components.support.base.feature.UserInteractionHandler
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.library.LibraryPageView
import org.mozilla.fenix.library.SelectionInteractor
@ -141,12 +142,18 @@ class HistoryView(
}
when (val mode = state.mode) {
is HistoryFragmentState.Mode.Normal ->
is HistoryFragmentState.Mode.Normal -> {
(activity as HomeActivity).setupNavigationToolbar(R.id.historyFragment)
setUiForNormalMode(
context.getString(R.string.library_history))
is HistoryFragmentState.Mode.Editing ->
context.getString(R.string.library_history)
)
}
is HistoryFragmentState.Mode.Editing -> {
(activity as HomeActivity).setupNavigationToolbar()
setUiForSelectingMode(
context.getString(R.string.history_multi_select_title, mode.selectedItems.size))
context.getString(R.string.history_multi_select_title, mode.selectedItems.size)
)
}
}
}

View File

@ -29,9 +29,11 @@ import android.util.Log
import android.util.TypedValue
import android.view.KeyEvent
import android.view.View
import android.view.accessibility.AccessibilityNodeInfo
import android.widget.SeekBar
import android.widget.SeekBar.OnSeekBarChangeListener
import android.widget.TextView
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat.RANGE_TYPE_PERCENT
import androidx.preference.Preference
import androidx.preference.PreferenceViewHolder
import org.mozilla.fenix.R
@ -340,6 +342,25 @@ class TextPercentageSeekBarPreference @JvmOverloads constructor(
val percentage = NumberFormat.getPercentInstance().format(decimalValue)
mSeekBarValueTextView?.text = percentage
}
mSeekBar?.setAccessibilityDelegate(object :
View.AccessibilityDelegate() {
override fun onInitializeAccessibilityNodeInfo(
host: View?,
info: AccessibilityNodeInfo?
) {
super.onInitializeAccessibilityNodeInfo(host, info)
val initialInfo = info?.rangeInfo
info?.rangeInfo = initialInfo?.let {
AccessibilityNodeInfo.RangeInfo.obtain(
RANGE_TYPE_PERCENT,
MIN_VALUE.toFloat(),
SEEK_BAR_MAX.toFloat(),
convertCurrentValue(it.current)
)
}
}
})
}
/**
@ -433,6 +454,10 @@ class TextPercentageSeekBarPreference @JvmOverloads constructor(
}
}
private fun convertCurrentValue(current: Float): Float {
return current * STEP_SIZE + MIN_VALUE.toFloat()
}
companion object {
private const val TAG = "SeekBarPreference"
private const val STEP_SIZE = 5

View File

@ -35,7 +35,6 @@ import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.searchengine.CustomSearchEngineStore
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.increaseTapArea
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.settings.SupportUtils
import java.util.Locale
@ -102,7 +101,6 @@ class AddSearchEngineFragment : Fragment(), CompoundButton.OnCheckedChangeListen
toggleCustomForm(selectedIndex == CUSTOM_INDEX)
custom_search_engines_learn_more.increaseTapArea(DPS_TO_INCREASE)
custom_search_engines_learn_more.setOnClickListener {
(activity as HomeActivity).openToBrowserAndLoad(
searchTermOrURL = SupportUtils.getSumoURLForTopic(

View File

@ -25,7 +25,6 @@ import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.components.searchengine.CustomSearchEngineStore
import org.mozilla.fenix.ext.increaseTapArea
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.settings.SupportUtils
@ -55,7 +54,6 @@ class EditCustomSearchEngineFragment : Fragment(R.layout.fragment_add_search_eng
val decodedUrl = Uri.decode(searchEngine.buildSearchUrl("%s"))
edit_search_string.setText(decodedUrl)
custom_search_engines_learn_more.increaseTapArea(DPS_TO_INCREASE)
custom_search_engines_learn_more.setOnClickListener {
(activity as HomeActivity).openToBrowserAndLoad(
searchTermOrURL = SupportUtils.getSumoURLForTopic(

View File

@ -39,6 +39,7 @@ class SyncedTabsLayout @JvmOverloads constructor(
SyncedTabsView.ErrorType.SYNC_ENGINE_UNAVAILABLE -> R.string.synced_tabs_enable_tab_syncing
SyncedTabsView.ErrorType.SYNC_UNAVAILABLE -> R.string.synced_tabs_connect_to_sync_account
SyncedTabsView.ErrorType.SYNC_NEEDS_REAUTHENTICATION -> R.string.synced_tabs_reauth
SyncedTabsView.ErrorType.NO_TABS_AVAILABLE -> R.string.synced_tabs_no_tabs
}
sync_tabs_status.text = context.getText(stringResId)

View File

@ -0,0 +1,124 @@
/* 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.tabtray
import androidx.annotation.VisibleForTesting
import androidx.navigation.NavController
import mozilla.components.browser.session.Session
import mozilla.components.browser.session.SessionManager
import mozilla.components.concept.engine.prompt.ShareData
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.collections.SaveCollectionStep
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.sessionsOfType
/**
* [TabTrayDialogFragment] controller.
*
* Delegated by View Interactors, handles container business logic and operates changes on it.
*/
interface TabTrayController {
fun onNewTabTapped(private: Boolean)
fun onTabTrayDismissed()
fun onShareTabsClicked(private: Boolean)
fun onSaveToCollectionClicked()
fun onCloseAllTabsClicked(private: Boolean)
}
@Suppress("TooManyFunctions")
class DefaultTabTrayController(
private val activity: HomeActivity,
private val navController: NavController,
private val dismissTabTray: () -> Unit,
private val showUndoSnackbar: (String, SessionManager.Snapshot) -> Unit,
private val registerCollectionStorageObserver: () -> Unit
) : TabTrayController {
override fun onNewTabTapped(private: Boolean) {
activity.browsingModeManager.mode = BrowsingMode.fromBoolean(private)
navController.navigate(TabTrayDialogFragmentDirections.actionGlobalHome(focusOnAddressBar = true))
dismissTabTray()
}
override fun onTabTrayDismissed() {
dismissTabTray()
}
override fun onSaveToCollectionClicked() {
val tabs = getListOfSessions(false)
val tabIds = tabs.map { it.id }.toList().toTypedArray()
val tabCollectionStorage = activity.components.core.tabCollectionStorage
val step = when {
// Show the SelectTabs fragment if there are multiple opened tabs to select which tabs
// you want to save to a collection.
tabs.size > 1 -> SaveCollectionStep.SelectTabs
// If there is an existing tab collection, show the SelectCollection fragment to save
// the selected tab to a collection of your choice.
tabCollectionStorage.cachedTabCollections.isNotEmpty() -> SaveCollectionStep.SelectCollection
// Show the NameCollection fragment to create a new collection for the selected tab.
else -> SaveCollectionStep.NameCollection
}
if (navController.currentDestination?.id == R.id.collectionCreationFragment) return
// Only register the observer right before moving to collection creation
registerCollectionStorageObserver()
val directions = TabTrayDialogFragmentDirections.actionGlobalCollectionCreationFragment(
tabIds = tabIds,
saveCollectionStep = step,
selectedTabIds = tabIds
)
navController.navigate(directions)
}
override fun onShareTabsClicked(private: Boolean) {
val tabs = getListOfSessions(private)
val data = tabs.map {
ShareData(url = it.url, title = it.title)
}
val directions = TabTrayDialogFragmentDirections.actionGlobalShareFragment(
data = data.toTypedArray()
)
navController.navigate(directions)
}
override fun onCloseAllTabsClicked(private: Boolean) {
val sessionManager = activity.components.core.sessionManager
val tabs = getListOfSessions(private)
val selectedIndex = sessionManager
.selectedSession?.let { sessionManager.sessions.indexOf(it) } ?: 0
val snapshot = tabs
.map(sessionManager::createSessionSnapshot)
.map {
it.copy(
engineSession = null,
engineSessionState = it.engineSession?.saveState()
)
}
.let { SessionManager.Snapshot(it, selectedIndex) }
tabs.forEach {
sessionManager.remove(it)
}
val snackbarMessage = if (private) {
activity.getString(R.string.snackbar_private_tabs_closed)
} else {
activity.getString(R.string.snackbar_tabs_closed)
}
showUndoSnackbar(snackbarMessage, snapshot)
}
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
private fun getListOfSessions(private: Boolean): List<Session> {
return activity.components.core.sessionManager.sessionsOfType(private = private).toList()
}
}

View File

@ -22,25 +22,21 @@ import mozilla.components.browser.session.SessionManager
import mozilla.components.browser.state.selector.normalTabs
import mozilla.components.browser.state.selector.privateTabs
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.concept.engine.prompt.ShareData
import mozilla.components.feature.tabs.tabstray.TabsFeature
import mozilla.components.feature.tab.collections.TabCollection
import mozilla.components.feature.tabs.TabsUseCases
import mozilla.components.feature.tabs.tabstray.TabsFeature
import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.collections.SaveCollectionStep
import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.components.TabCollectionStorage
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.sessionsOfType
import org.mozilla.fenix.utils.allowUndo
import org.mozilla.fenix.components.TabCollectionStorage
@SuppressWarnings("TooManyFunctions", "LargeClass")
class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
class TabTrayDialogFragment : AppCompatDialogFragment() {
private val tabsFeature = ViewBoundFeatureWrapper<TabsFeature>()
private var _tabTrayView: TabTrayView? = null
private val tabTrayView: TabTrayView
@ -108,10 +104,19 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
_tabTrayView = TabTrayView(
view.tabLayout,
this,
isPrivate,
requireContext().resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE,
viewLifecycleOwner.lifecycleScope
interactor = TabTrayFragmentInteractor(
DefaultTabTrayController(
activity = (activity as HomeActivity),
navController = findNavController(),
dismissTabTray = ::dismissAllowingStateLoss,
showUndoSnackbar = ::showUndoSnackbar,
registerCollectionStorageObserver = ::registerCollectionStorageObserver
)
),
isPrivate = isPrivate,
startingInLandscape = requireContext().resources.configuration.orientation ==
Configuration.ORIENTATION_LANDSCAPE,
lifecycleScope = viewLifecycleOwner.lifecycleScope
) { tabsFeature.get()?.filterTabs(it) }
tabsFeature.set(
@ -195,96 +200,6 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
}
}
override fun onNewTabTapped(private: Boolean) {
(activity as HomeActivity).browsingModeManager.mode = BrowsingMode.fromBoolean(private)
findNavController().navigate(TabTrayDialogFragmentDirections.actionGlobalHome(focusOnAddressBar = true))
dismissAllowingStateLoss()
}
override fun onTabTrayDismissed() {
dismissAllowingStateLoss()
}
override fun onSaveToCollectionClicked() {
val tabs = getListOfSessions(false)
val tabIds = tabs.map { it.id }.toList().toTypedArray()
val tabCollectionStorage = (activity as HomeActivity).components.core.tabCollectionStorage
val navController = findNavController()
val step = when {
// Show the SelectTabs fragment if there are multiple opened tabs to select which tabs
// you want to save to a collection.
tabs.size > 1 -> SaveCollectionStep.SelectTabs
// If there is an existing tab collection, show the SelectCollection fragment to save
// the selected tab to a collection of your choice.
tabCollectionStorage.cachedTabCollections.isNotEmpty() -> SaveCollectionStep.SelectCollection
// Show the NameCollection fragment to create a new collection for the selected tab.
else -> SaveCollectionStep.NameCollection
}
if (navController.currentDestination?.id == R.id.collectionCreationFragment) return
// Only register the observer right before moving to collection creation
registerCollectionStorageObserver()
val directions = TabTrayDialogFragmentDirections.actionGlobalCollectionCreationFragment(
tabIds = tabIds,
saveCollectionStep = step,
selectedTabIds = tabIds
)
navController.navigate(directions)
}
override fun onShareTabsClicked(private: Boolean) {
val tabs = getListOfSessions(private)
val data = tabs.map {
ShareData(url = it.url, title = it.title)
}
val directions = TabTrayDialogFragmentDirections.actionGlobalShareFragment(
data = data.toTypedArray()
)
findNavController().navigate(directions)
}
override fun onCloseAllTabsClicked(private: Boolean) {
val sessionManager = requireContext().components.core.sessionManager
val tabs = getListOfSessions(private)
val selectedIndex = sessionManager
.selectedSession?.let { sessionManager.sessions.indexOf(it) } ?: 0
val snapshot = tabs
.map(sessionManager::createSessionSnapshot)
.map { it.copy(engineSession = null, engineSessionState = it.engineSession?.saveState()) }
.let { SessionManager.Snapshot(it, selectedIndex) }
tabs.forEach {
sessionManager.remove(it)
}
val snackbarMessage = if (tabTrayView.isPrivateModeSelected) {
getString(R.string.snackbar_private_tabs_closed)
} else {
getString(R.string.snackbar_tabs_closed)
}
viewLifecycleOwner.lifecycleScope.allowUndo(
requireView(),
snackbarMessage,
getString(R.string.snackbar_deleted_undo),
{
sessionManager.restore(snapshot)
},
operation = { },
elevation = ELEVATION
)
}
private fun getListOfSessions(private: Boolean): List<Session> {
return requireContext().components.core.sessionManager.sessionsOfType(private = private)
.toList()
}
private fun navigateHomeIfNeeded(state: BrowserState) {
val shouldPop = if (tabTrayView.isPrivateModeSelected) {
state.privateTabs.isEmpty()
@ -301,6 +216,21 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
requireComponents.core.tabCollectionStorage.register(collectionStorageObserver, this)
}
private fun showUndoSnackbar(snackbarMessage: String, snapshot: SessionManager.Snapshot) {
view?.let {
viewLifecycleOwner.lifecycleScope.allowUndo(
it,
snackbarMessage,
getString(R.string.snackbar_deleted_undo),
{
context?.components?.core?.sessionManager?.restore(snapshot)
},
operation = { },
elevation = ELEVATION
)
}
}
private fun showCollectionSnackbar() {
view.let {
val snackbar = FenixSnackbar
@ -328,7 +258,9 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
fun show(fragmentManager: FragmentManager) {
// If we've killed the fragmentManager. Let's not try to show the tabs tray.
if (fragmentManager.isDestroyed) { return }
if (fragmentManager.isDestroyed) {
return
}
// We want to make sure we don't accidentally show the dialog twice if
// a user somehow manages to trigger `show()` twice before we present the dialog.

View File

@ -0,0 +1,38 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.tabtray
interface TabTrayInteractor {
fun onNewTabTapped(private: Boolean)
fun onTabTrayDismissed()
fun onShareTabsClicked(private: Boolean)
fun onSaveToCollectionClicked()
fun onCloseAllTabsClicked(private: Boolean)
}
/**
* Interactor for the tab tray fragment.
*/
class TabTrayFragmentInteractor(private val controller: TabTrayController) : TabTrayInteractor {
override fun onNewTabTapped(private: Boolean) {
controller.onNewTabTapped(private)
}
override fun onTabTrayDismissed() {
controller.onTabTrayDismissed()
}
override fun onShareTabsClicked(private: Boolean) {
controller.onShareTabsClicked(private)
}
override fun onSaveToCollectionClicked() {
controller.onSaveToCollectionClicked()
}
override fun onCloseAllTabsClicked(private: Boolean) {
controller.onCloseAllTabsClicked(private)
}
}

View File

@ -32,13 +32,6 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
interface TabTrayInteractor {
fun onNewTabTapped(private: Boolean)
fun onTabTrayDismissed()
fun onShareTabsClicked(private: Boolean)
fun onSaveToCollectionClicked()
fun onCloseAllTabsClicked(private: Boolean)
}
/**
* View that contains and configures the BrowserAwesomeBar
*/
@ -219,7 +212,11 @@ class TabTrayView(
}
}
view.tabsTray.asView().isVisible = !hasNoTabs
view.tabsTray.asView().visibility = if (hasNoTabs) {
View.INVISIBLE
} else {
View.VISIBLE
}
view.tab_tray_overflow.isVisible = !hasNoTabs
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -2,35 +2,45 @@
<!-- 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/. -->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/bookmarks_wrapper"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/bookmarks_wrapper"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/bookmark_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/library_site_item" />
android:id="@+id/bookmark_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/library_site_item" />
<TextView
android:id="@+id/bookmarks_empty_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingTop="10dp"
android:paddingBottom="0dp"
android:text="@string/bookmarks_empty_message"
android:textColor="?secondaryText"
android:textSize="16sp"
android:visibility="gone" />
android:id="@+id/bookmarks_empty_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/bookmarks_empty_message"
android:textColor="?secondaryText"
android:textSize="16sp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/bookmark_folders_sign_in"
style="@style/NeutralButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginHorizontal="16dp"
android:text="@string/bookmark_sign_in_button" />
<ProgressBar
android:id="@+id/bookmarks_progress_bar"

View File

@ -1,14 +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/. -->
<com.google.android.material.button.MaterialButton
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bookmark_folders_sign_in"
style="@style/NeutralButton"
android:text="@string/bookmark_sign_in_button"
android:layout_marginHorizontal="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>

View File

@ -63,6 +63,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/exceptions_empty_message_learn_more_link"
android:minHeight="@dimen/accessibility_min_height"
android:textColor="?accent"
android:visibility="visible"
android:contentDescription="@string/search_add_custom_engine_learn_more_description"

View File

@ -11,6 +11,6 @@
<LinearLayout
android:id="@+id/bookmarkLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -10,4 +10,11 @@
app:iconTint="?primaryText"
android:title="@string/bookmark_add_folder"
app:showAsAction="ifRoom" />
<item
android:id="@+id/close_bookmarks"
android:icon="@drawable/ic_close"
app:iconTint="?primaryText"
android:title="@string/content_description_close_button"
app:showAsAction="ifRoom" />
</menu>

View File

@ -2,4 +2,13 @@
<!-- 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/. -->
<menu />
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/close_history"
android:icon="@drawable/ic_close"
app:iconTint="?primaryText"
android:title="@string/content_description_close_button"
app:showAsAction="ifRoom" />
</menu>

View File

@ -1,9 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="app_name_private_5">Прыватны %s</string>
<!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="app_name_private_4">%s (прыватна)</string>
<!-- Home Fragment -->
<!-- Content description (not visible, for screen readers etc.): "Three dot" menu button. -->
<string name="content_description_menu">Дадаткова</string>
<!-- Content description (not visible, for screen readers etc.): "Private Browsing" menu button. -->
<string name="content_description_private_browsing_button">Уключыць прыватнае агляданне</string>
<!-- Content description (not visible, for screen readers etc.): "Private Browsing" menu button. -->
<string name="content_description_disable_private_browsing_button">Адключыць прыватнае агляданне</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Увядзіце запыт або адрас</string>
<!-- Private Browsing -->
<!-- Title for private session option -->
<string name="private_browsing_title">Вы ў прыватным сеансе</string>
<string name="private_browsing_common_myths">Шырокавядомыя забабоны пра прыватнае агляданне</string>
<!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Выдаліць сеанс</string>
@ -75,6 +90,8 @@
<string name="browser_menu_read">Рэжым чытання</string>
<!-- Browser menu button content description to close reader mode and return the user to the regular browser -->
<string name="browser_menu_read_close">Закрыць Рэжым чытання</string>
<!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">Адкрыць у праграме</string>
<!-- Browser menu button to configure reader mode appearance e.g. the used font type and size -->
<string name="browser_menu_read_appearance">Выгляд</string>
@ -89,6 +106,12 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Сканаваць</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Цэтлікі</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Налады пошукавых сістэм</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Шукаць з</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Гэтым разам шукаць у:</string>
<!-- Button in the search view that lets a user navigate to the site in their clipboard -->
@ -127,6 +150,8 @@
<string name="preferences_search_address_bar">Адрасны радок</string>
<!-- Preference linking to help about Fenix -->
<string name="preferences_help">Даведка</string>
<!-- Preference link to rating Fenix on the Play Store -->
<string name="preferences_rate">Ацаніць у Google Play</string>
<!-- Preference for giving feedback about Fenix -->
<string name="preferences_feedback">Даць водгук</string>
<!-- Preference linking to about page for Fenix
@ -181,6 +206,10 @@
<string name="preferences_privacy_link">Паведамленне аб прыватнасці</string>
<!-- Preference category for developer tools -->
<string name="developer_tools_category">Прылады распрацоўшчыка</string>
<!-- Preference for developers -->
<string name="preferences_remote_debugging">Аддаленая адладка праз USB</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Пошукавыя скароты</string>
<!-- Preference title for switch preference to show search suggestions -->
<string name="preferences_show_search_suggestions">Паказваць пошукавыя прапановы</string>
<!-- Preference title for switch preference to show voice search button -->
@ -209,11 +238,26 @@
<string name="preferences_sync_bookmarks">Закладкі</string>
<!-- Preference for syncing logins -->
<string name="preferences_sync_logins">Лагіны</string>
<!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs_2">Адкрытыя карткі</string>
<!-- Preference for signing out -->
<string name="preferences_sign_out">Выйсці</string>
<!-- Preference displays and allows changing current FxA device name -->
<string name="preferences_sync_device_name">Назва прылады</string>
<!-- Text shown when user enters empty device name -->
<string name="empty_device_name_error">Назва прылады не можа быць пустой.</string>
<!-- Label indicating that sync is in progress -->
<string name="sync_syncing_in_progress">Сінхранізацыя…</string>
<!-- Label summary the date we last synced. The first parameter is date stamp showing last time synced -->
<string name="sync_last_synced_summary">Апошняя сінхранізацыя: %s</string>
<!-- Label summary showing never synced -->
<string name="sync_never_synced_summary">Апошняя сінхранізацыя: ніколі</string>
<!-- Text for displaying the default device name.
The first parameter is the application name, the second is the device manufacturer name
and the third is the device model. -->
<string name="default_device_name_2">%1$s на %2$s %3$s</string>
<!-- Send Tab -->
<!-- Name of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app -->
<string name="fxa_received_tab_channel_name">Атрыманыя карткі</string>
@ -231,25 +275,61 @@
<string name="preferences_tracking_protection">Ахова ад сачэння</string>
<!-- Preference for tracking protection exceptions -->
<string name="preferences_tracking_protection_exceptions">Выключэнні</string>
<!-- Preference description for tracking protection exceptions -->
<string name="preferences_tracking_protection_exceptions_description">Ахова ад сачэння выключана на гэтых сайтах</string>
<!-- Text displayed when there are no exceptions, with learn more link that brings users to a tracking protection SUMO page -->
<string name="exceptions_empty_message_learn_more_link">Даведацца больш</string>
<!-- Preference switch for Telemetry -->
<string name="preferences_telemetry">Тэлеметрыя</string>
<!-- Preference description for usage and technical data collection -->
<string name="preferences_usage_data_description">Дзяліцца звесткамі пра прадукцыйнасць, выкарыстанне, апаратнае забеспячэнне і налады вашага браўзера з Mozilla, каб дапамагчы ўдасканаліць %1$s</string>
<!-- Title for experiments preferences -->
<string name="preference_experiments">Доследы</string>
<!-- Preference switch for crash reporter -->
<string name="preferences_crash_reporter">Паведамляльнік пра крахі</string>
<!-- Preference switch for Mozilla location service -->
<string name="preferences_mozilla_location_service">Служба месцазнаходжання Mozilla</string>
<!-- Turn On Sync Preferences -->
<!-- Header of the Turn on Sync preference view -->
<string name="preferences_sync">Уключыць сінхранізацыю</string>
<!-- Preference for account login -->
<string name="preferences_sync_sign_in">Увайсці</string>
<!-- Preference for removing FxA account -->
<string name="preferences_sync_remove_account">Выдаліць уліковы запіс</string>
<!-- Button to open camera for pairing -->
<string name="pair_open_camera">Адкрыць камеру</string>
<!-- Button to cancel pairing -->
<string name="pair_cancel">Адмяніць</string>
<!-- Toolbar Preferences -->
<!-- Preference for using top toolbar -->
<string name="preference_top_toolbar">Зверху</string>
<!-- Preference for using bottom toolbar -->
<string name="preference_bottom_toolbar">Знізу</string>
<!-- Theme Preferences -->
<!-- Preference for using light theme -->
<string name="preference_light_theme">Светлая</string>
<!-- Preference for using dark theme -->
<string name="preference_dark_theme">Цёмная</string>
<!-- Library -->
<!-- Option in Library to open Sessions page -->
<string name="library_sessions">Сеансы</string>
<!-- Option in Library to open Screenshots page -->
<string name="library_screenshots">Здымкі экрана</string>
<!-- Option in Library to open Downloads page -->
<string name="library_downloads">Сцягванні</string>
<!-- Option in library to open Bookmarks page -->
<string name="library_bookmarks">Закладкі</string>
<!-- Option in library to open Desktop Bookmarks root page -->
<string name="library_desktop_bookmarks_root">Закладкі камп’ютара</string>
<!-- Option in library to open Desktop Bookmarks "menu" page -->
<string name="library_desktop_bookmarks_menu">Меню закладак</string>
<!-- Option in library to open Desktop Bookmarks "toolbar" page -->
@ -295,6 +375,8 @@
<string name="tab_tray_menu_item_close">Закрыць усе карткі</string>
<!-- Shortcut action to open new tab -->
<string name="tab_tray_menu_open_new_tab">Новая картка</string>
<!-- Shortcut action to open the home screen -->
<string name="tab_tray_menu_home">Дадому</string>
<!-- Content description (not visible, for screen readers etc.): Removes tab from collection button. Removes the selected tab from collection when pressed -->
<string name="remove_tab_from_collection">Выдаліць картку з калекцыі</string>
<!-- Content description (not visible, for screen readers etc.): Close tab button. Closes the current session when pressed -->
@ -305,6 +387,8 @@
<string name="tabs_menu_close_all_tabs">Закрыць усе карткі</string>
<!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">Падзяліцца карткамі</string>
<!-- Open tabs menu item to save tabs to collection -->
<string name="tabs_menu_save_to_collection1">Захаваць карткі у калекцыі</string>
<!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">Меню картак</string>
<!-- Tab menu item to share the tab -->
@ -328,8 +412,30 @@
<!-- Text for the menu button to remove a top site -->
<string name="remove_top_site">Выдаліць</string>
<!-- Postfix for private WebApp titles, placeholder is replaced with app name -->
<string name="pwa_site_controls_title_private">%1$s (Прыватны рэжым)</string>
<!-- History -->
<!-- Text for the button to clear all history -->
<string name="history_delete_all">Выдаліць гісторыю</string>
<!-- Text for the dialog to confirm clearing all history -->
<string name="history_delete_all_dialog">Вы ўпэўненыя, што хочаце выдаліць сваю гісторыю?</string>
<!-- Text for the snackbar to confirm that multiple browsing history items has been deleted -->
<string name="history_delete_multiple_items_snackbar">Гісторыя выдалена</string>
<!-- Text for the snackbar to confirm that a single browsing history item has been deleted. The first parameter is the shortened URL of the deleted history item. -->
<string name="history_delete_single_item_snackbar">%1$s выдалены</string>
<!-- Text for positive action to delete history in deleting history dialog -->
<string name="history_clear_dialog">Ачысціць</string>
<!-- History overflow menu copy button -->
<string name="history_menu_copy_button">Капіраваць</string>
<!-- History overflow menu share button -->
<string name="history_menu_share_button">Падзяліцца</string>
<!-- History overflow menu open in new tab button -->
<string name="history_menu_open_in_new_tab_button">Адкрыць у новай картцы</string>
<!-- History overflow menu open in private tab button -->
<string name="history_menu_open_in_private_tab_button">Адкрыць у прыватнай картцы</string>
<!-- Text for the button to delete a single history item -->
<string name="history_delete_item">Выдаліць</string>
<!-- History multi select title in app bar
The first parameter is the number of bookmarks selected -->
<string name="history_multi_select_title">Выбрана: %1$d</string>
@ -343,6 +449,11 @@
<!-- Text for the header that groups the history the past 30 days -->
<string name="history_30_days">Апошнія 30 дзён</string>
<!-- Text for the header that groups the history older than the last month -->
<string name="history_older">Даўней</string>
<!-- Send crash report checkbox text on the tab crash page -->
<string name="tab_crash_send_report">Адправіць справаздачу аб краху ў Mozilla</string>
<!-- Close tab button text on the tab crash page -->
<string name="tab_crash_close">Закрыць картку</string>
<!-- Restore tab button text on the tab crash page -->
@ -357,29 +468,111 @@
<!-- Bookmarks -->
<!-- Content description for bookmarks library menu -->
<string name="bookmark_menu_content_description">Меню закладак</string>
<!-- Screen title for editing bookmarks -->
<string name="bookmark_edit">Рэдагаваць закладку</string>
<!-- Screen title for selecting a bookmarks folder -->
<string name="bookmark_select_folder">Выбраць папку</string>
<!-- Confirmation message for a dialog confirming if the user wants to delete the selected folder -->
<string name="bookmark_delete_folder_confirmation_dialog">Вы ўпэўнены, што жадаеце выдаліць гэту папку?</string>
<!-- Snackbar title shown after a folder has been deleted. This first parameter is the name of the deleted folder -->
<string name="bookmark_delete_folder_snackbar">%1$s выдалена</string>
<!-- deprecated: Snackbar title shown after a bookmark has been created. -->
<string name="bookmark_created_snackbar">Закладка створана.</string>
<!-- Snackbar title shown after a bookmark has been created. -->
<string name="bookmark_saved_snackbar">Закладка захавана!</string>
<!-- Bookmark overflow menu edit button -->
<string name="bookmark_menu_edit_button">Змяніць</string>
<!-- Bookmark overflow menu select button -->
<string name="bookmark_menu_select_button">Выбраць</string>
<!-- Bookmark overflow menu copy button -->
<string name="bookmark_menu_copy_button">Капіраваць</string>
<!-- Bookmark overflow menu share button -->
<string name="bookmark_menu_share_button">Падзяліцца</string>
<!-- Bookmark overflow menu open in new tab button -->
<string name="bookmark_menu_open_in_new_tab_button">Адкрыць у новай картцы</string>
<!-- Bookmark overflow menu open in private tab button -->
<string name="bookmark_menu_open_in_private_tab_button">Адкрыць у прыватнай картцы</string>
<!-- Bookmark overflow menu delete button -->
<string name="bookmark_menu_delete_button">Выдаліць</string>
<!--Bookmark overflow menu save button -->
<string name="bookmark_menu_save_button">Захаваць</string>
<!-- Bookmark multi select title in app bar
The first parameter is the number of bookmarks selected -->
<string name="bookmarks_multi_select_title">Выбрана: %1$d</string>
<!-- Bookmark editing screen title -->
<string name="edit_bookmark_fragment_title">Рэдагаваць закладку</string>
<!-- Bookmark folder editing screen title -->
<string name="edit_bookmark_folder_fragment_title">Рэдагаваць папку</string>
<!-- Bookmark sign in button message -->
<string name="bookmark_sign_in_button">Увайдзіце, каб убачыць сінхранізаваныя закладкі</string>
<!-- Bookmark URL editing field label -->
<string name="bookmark_url_label">URL</string>
<!-- Bookmark FOLDER editing field label -->
<string name="bookmark_folder_label">ПАПКА</string>
<!-- Bookmark NAME editing field label -->
<string name="bookmark_name_label">НАЗВА</string>
<!-- Bookmark add folder screen title -->
<string name="bookmark_add_folder_fragment_label">Дадаць папку</string>
<!-- Bookmark select folder screen title -->
<string name="bookmark_select_folder_fragment_label">Выбраць папку</string>
<!-- Bookmark editing error missing or improper URL -->
<string name="bookmark_invalid_url_error">Несапраўдны URL</string>
<!-- Bookmark screen message for empty bookmarks folder -->
<string name="bookmarks_empty_message">Няма закладак</string>
<!-- Bookmark snackbar message on deletion
The first parameter is the host part of the URL of the bookmark deleted, if any -->
<string name="bookmark_deletion_snackbar_message">%1$s выдалена</string>
<!-- Bookmark snackbar message on deleting multiple bookmarks -->
<string name="bookmark_deletion_multiple_snackbar_message_2">Закладкі выдалены</string>
<!-- Bookmark undo button for deletion snackbar action -->
<string name="bookmark_undo_deletion">АДМЯНІЦЬ</string>
<!-- Site Permissions -->
<!-- Site permissions preferences header -->
<string name="permissions_header">Дазволы</string>
<!-- Button label that take the user to the Android App setting -->
<string name="phone_feature_go_to_settings">Перайсці ў налады</string>
<!-- Label that indicates that this option it the recommended one -->
<string name="phone_feature_recommended">Рэкамендуецца</string>
<!-- button that allows editing site permissions settings -->
<string name="quick_settings_sheet_manage_site_permissions">Кіраваць дазволамі сайта</string>
<!-- Button label for clearing all the information of site permissions-->
<string name="clear_permissions">Ачысціць дазволы</string>
<!-- Button label for clearing a site permission-->
<string name="clear_permission">Ачысціць дазвол</string>
<!-- Button label for clearing all the information on all sites-->
<string name="clear_permissions_on_all_sites">Ачысціць дазволы на ўсіх сайтах</string>
<!-- Preference for altering video and audio autoplay for all websites -->
<string name="preference_browser_feature_autoplay">Аўтапрайграванне</string>
<!-- Preference for altering the camera access for all websites -->
<string name="preference_phone_feature_camera">Камера</string>
<!-- Preference for altering the microphone access for all websites -->
<string name="preference_phone_feature_microphone">Мікрафон</string>
<!-- Preference for altering the location access for all websites -->
<string name="preference_phone_feature_location">Месцазнаходжанне</string>
<!-- Preference for altering the notification access for all websites -->
<string name="preference_phone_feature_notification">Абвестка</string>
<!--Label that indicates a permission is by the Android OS-->
<string name="phone_feature_blocked_by_android">Заблакавана Android</string>
<!-- Preference for showing a list of websites that the default configurations won't apply to them -->
<string name="preference_exceptions">Выняткі</string>
<!-- Summary of tracking protection preference if tracking protection is set to on -->
<string name="tracking_protection_on">Уключана</string>
<!-- Summary of tracking protection preference if tracking protection is set to off -->
<string name="tracking_protection_off">Выключана</string>
<!-- Label that indicates that all video and audio autoplay is allowed -->
<string name="preference_option_autoplay_allowed2">Дазволіць гук і відэа</string>
<!-- Label that indicates that all video and audio autoplay is blocked -->
<string name="preference_option_autoplay_blocked3">Блакаваць гук і відэа</string>
<!-- Summary of delete browsing data on quit preference if it is set to on -->
<string name="delete_browsing_data_quit_on">Уключана</string>
<!-- Summary of delete browsing data on quit preference if it is set to off -->
<string name="delete_browsing_data_quit_off">Выключана</string>
<!-- Collections -->
<!-- Collections header on home fragment -->
<string name="collections_header">Калекцыі</string>
@ -393,10 +586,14 @@
<string name="create_collection_select_tabs">Выберыце карткі</string>
<!-- Title for the "select collection" step of the collection creator -->
<string name="create_collection_select_collection">Выберыце калекцыю</string>
<!-- Title for the "name collection" step of the collection creator -->
<string name="create_collection_name_collection">Назва калекцыі</string>
<!-- Button to add new collection for the "select collection" step of the collection creator -->
<string name="create_collection_add_new_collection">Дадаць новую калекцыю</string>
<!-- Button to select all tabs in the "select tabs" step of the collection creator -->
<string name="create_collection_select_all">Вылучыць усе</string>
<!-- Button to deselect all tabs in the "select tabs" step of the collection creator -->
<string name="create_collection_deselect_all">Адмяніць выбар усіх</string>
<!-- Text shown in snackbar when multiple tabs have been saved in a collection -->
<string name="create_collection_tabs_saved">Карткі захаваны!</string>
<!-- Text shown in snackbar when one tab has been saved in a collection -->
@ -437,9 +634,23 @@
<!-- Text displayed when sync is offline and cannot be accessed -->
<string name="sync_offline">Па-за сеткай</string>
<!-- An option to connect additional devices -->
<string name="sync_connect_device">Падключыць іншую прыладу</string>
<!-- Confirmation dialog button -->
<string name="sync_confirmation_button">Зразумела</string>
<!-- Add new device screen title -->
<string name="sync_add_new_device_title">Даслаць на прыладу</string>
<!-- Text for the warning message on the Add new device screen -->
<string name="sync_add_new_device_message">Няма падключаных прылад</string>
<!-- Text for the button to learn about sending tabs -->
<string name="sync_add_new_device_learn_button">Даведацца больш пра адпраўку картак…</string>
<!-- Text for the button to connect another device -->
<string name="sync_add_new_device_connect_button">Злучыць іншую прыладу…</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">Сеанс прыватнага аглядання</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">Выдаліць прыватныя карткі</string>
<!-- Text shown in the notification that pops up to remind the user that a private browsing session is active. -->
@ -449,6 +660,8 @@
<!-- 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">Выдаліць і адкрыць</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">Працуе на</string>
<!-- Text shown in snackbar when user deletes a collection -->
<string name="snackbar_collection_deleted">Калекцыя выдалена</string>
<!-- Text shown in snackbar when user renames a collection -->
@ -463,9 +676,97 @@
<!-- Text shown in snackbar when user closes all tabs -->
<string name="snackbar_tabs_closed">Карткі закрыты</string>
<!-- Text shown in snackbar when user closes a private tab -->
<string name="snackbar_private_tab_closed">Прыватная картка закрыта</string>
<!-- Text shown in snackbar when user closes all private tabs -->
<string name="snackbar_private_tabs_closed">Прыватныя карткі закрыты</string>
<!-- Text shown in snackbar when user deletes all private tabs -->
<string name="snackbar_private_tabs_deleted">Прыватныя карткі выдалены</string>
<!-- Text shown in snackbar to undo deleting a tab, top site or collection -->
<string name="snackbar_deleted_undo">АДМЯНІЦЬ</string>
<!-- Text shown in snackbar when user removes a top site -->
<string name="snackbar_top_site_removed">Сайт выдалены</string>
<!-- Text for action to undo deleting a tab or collection shown in a11y dialog -->
<string name="a11y_dialog_deleted_undo">Адмяніць</string>
<!-- Text for action to confirm deleting a tab or collection shown in a11y dialog -->
<string name="a11y_dialog_deleted_confirm">Пацвердзіць</string>
<!-- QR code scanner prompt dialog positive option to allow navigation to scanned link -->
<string name="qr_scanner_dialog_positive">ДАЗВОЛІЦЬ</string>
<!-- QR code scanner prompt dialog positive option to deny navigation to scanned link -->
<string name="qr_scanner_dialog_negative">АДМОВІЦЬ</string>
<!-- Tab collection deletion prompt dialog message. Placeholder will be replaced with the collection name -->
<string name="tab_collection_dialog_message">Вы ўпэўнены, што хочаце выдаліць %1$s?</string>
<!-- Tab collection deletion prompt dialog option to delete the collection -->
<string name="tab_collection_dialog_positive">Выдаліць</string>
<!-- Tab collection deletion prompt dialog option to cancel deleting the collection -->
<string name="tab_collection_dialog_negative">Адмена</string>
<!-- Text displayed in a notification when the user enters full screen mode -->
<string name="full_screen_notification">Уваход у поўнаэкранны рэжым</string>
<!-- Message for copying the URL via long press on the toolbar -->
<string name="url_copied">URL скапіраваны</string>
<!-- Title for Accessibility Text Size Scaling Preference -->
<string name="preference_accessibility_font_size_title">Памер шрыфту</string>
<!-- Title for Accessibility Text Automatic Size Scaling Preference -->
<string name="preference_accessibility_auto_size_2">Аўтаматычны памер шрыфту</string>
<!-- Title for the tabs item in Delete browsing data -->
<string name="preferences_delete_browsing_data_tabs_title_2">Адкрытыя карткі</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</string>
<!-- Subtitle for the data and history items in delete browsing data, parameter will be replaced with the
number of history items the user has -->
<string name="preferences_delete_browsing_data_browsing_data_subtitle">Адрасы: %d</string>
<!-- Title for history items in Delete browsing data -->
<string name="preferences_delete_browsing_data_browsing_history_title">Гісторыя</string>
<!-- Title for the cookies item in Delete browsing data -->
<string name="preferences_delete_browsing_data_cookies">Кукі</string>
<!-- Title for the site permissions item in Delete browsing data -->
<string name="preferences_delete_browsing_data_site_permissions">Дазволы для сайтаў</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">Гісторыя аглядання</string>
<!-- Action item in menu for the Delete browsing data on quit feature -->
<string name="delete_browsing_data_on_quit_action">Выйсці</string>
<!-- Text for the cancel button for the data deletion dialog -->
<string name="delete_browsing_data_prompt_cancel">Адмена</string>
<!-- Text for the allow button for the data deletion dialog -->
<string name="delete_browsing_data_prompt_allow">Выдаліць</string>
<!-- text for firefox preview moving tip button. "Firefox for Android Beta" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_button_2">Атрымаць Firefox для Android Beta</string>
<!-- text for firefox preview moving tip header. "Firefox Nightly" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header_preview_installed">Firefox Nightly пераехаў</string>
<!-- text for firefox preview moving tip header. "Firefox Nightly" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header_preview_not_installed">Firefox Nightly пераехаў</string>
<!-- text for firefox preview moving tip button -->
<string name="tip_firefox_preview_moved_button_preview_not_installed">Атрымаць новы Nightly</string>
<!-- Onboarding -->
<!-- Text for onboarding welcome message
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_header">Вітаем у %s!</string>
<!-- text for the Firefox Accounts section header -->
<string name="onboarding_fxa_section_header">Ужо маеце ўліковы запіс?</string>
<!-- text for the "What's New" onboarding card header -->
<string name="onboarding_whats_new_header1">Паглядзіце, што новага</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">Увайсці ў Firefox</string>
<!-- text to display in the snackbar if automatic sign-in fails. user may try again -->
<string name="onboarding_firefox_account_automatic_signin_failed">Няўдача ўваходу</string>
<!-- text for the tracking protection onboarding card header -->
<string name="onboarding_tracking_protection_header_2">Аўтаматычная прыватнасць</string>
<!-- text for tracking protection radio button option for standard level of blocking -->
<string name="onboarding_tracking_protection_standard_button_2">Стандартная (прадвызначана)</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">Строгая (рэкамендуецца)</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_option">Строгая</string>
<!-- text for the private browsing onboarding card header -->
<string name="onboarding_private_browsing_header">Аглядайце прыватна</string>
<!-- text for the private browsing onbording card button, that launches settings -->
<string name="onboarding_private_browsing_button">Адкрыць налады</string>
<!-- text for the privacy notice onboarding card header -->
@ -482,6 +783,94 @@
<!-- Automatic theme setting (will follow device setting) -->
<string name="onboarding_theme_automatic_title">Аўтаматычна</string>
<!-- Theme setting for dark mode -->
<string name="onboarding_theme_dark_title">Цёмная тэма</string>
<!-- Theme setting for light mode -->
<string name="onboarding_theme_light_title">Светлая тэма</string>
<!-- Text shown in snackbar when multiple tabs have been sent to device -->
<string name="sync_sent_tabs_snackbar">Карткі адпраўлены!</string>
<!-- Text shown in snackbar when one tab has been sent to device -->
<string name="sync_sent_tab_snackbar">Картка адпраўлена!</string>
<!-- Text shown in snackbar when sharing tabs failed -->
<string name="sync_sent_tab_error_snackbar">Немагчыма адправіць</string>
<!-- Text shown in snackbar for the "retry" action that the user has after sharing tabs failed -->
<string name="sync_sent_tab_error_snackbar_action">ПАЎТАРЫЦЬ</string>
<!-- Title of QR Pairing Fragment -->
<string name="sync_scan_code">Скануйце код</string>
<!-- Text shown in confirmation dialog to sign out of account -->
<string name="sign_out_confirmation_message">Firefox спыніць сінхранізацыю з вашым уліковым запісам, але не выдаліць дадзеныя аглядання на гэтай прыладзе.</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 спыніць сінхранізацыю з вашым уліковым запісам, але не выдаліць дадзеныя аглядання на гэтай прыладзе.</string>
<!-- Option to continue signing out of account shown in confirmation dialog to sign out of account -->
<string name="sign_out_disconnect">Адлучыцца</string>
<!-- Option to cancel signing out shown in confirmation dialog to sign out of account -->
<string name="sign_out_cancel">Адмена</string>
<!-- Enhanced Tracking Protection -->
<!-- Link displayed in enhanced tracking protection panel to access tracking protection settings -->
<string name="etp_settings">Налады аховы</string>
<!-- Preference title for enhanced tracking protection settings -->
<string name="preference_enhanced_tracking_protection">Узмоцненая ахова ад сачэння</string>
<!-- Title for the description of enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_title">Аглядайце без старонніх вачэй</string>
<!-- Description of enhanced tracking protection. The first parameter is the name of the application (For example: Fenix) -->
<string name="preference_enhanced_tracking_protection_explanation">Захоўвайце свае дадзеныя пры сабе. %s абараняе вас ад многіх самых распаўсюджаных трэкераў, якія сочаць за тым, што вы робіце ў інтэрнэце.</string>
<!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">Даведацца больш</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_default_1">Стандартная (прадвызначана)</string>
<!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">Строгая</string>
<!-- Preference for enhanced tracking protection for the custom protection settings -->
<string name="preference_enhanced_tracking_protection_custom">Адмыслова</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_custom_description_2">Выберыце, якія трэкеры і скрыпты трэба заблакаваць.</string>
<!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings -->
<!-- Preference for enhanced tracking protection for the custom protection settings for cookies-->
<string name="preference_enhanced_tracking_protection_custom_cookies">Кукі</string>
<!-- Option for enhanced tracking protection for the custom protection settings for cookies-->
<string name="preference_enhanced_tracking_protection_custom_cookies_1">Трэкеры міжсайтавыя і сацыяльных сетак</string>
<!-- Option for enhanced tracking protection for the custom protection settings for cookies-->
<string name="preference_enhanced_tracking_protection_custom_cookies_2">Кукі з ненаведаных сайтаў</string>
<!-- Option for enhanced tracking protection for the custom protection settings for cookies-->
<string name="preference_enhanced_tracking_protection_custom_cookies_3">Усе кукі трэцяга боку (можа парушыць працу вэб-сайтаў)</string>
<!-- Option for enhanced tracking protection for the custom protection settings for cookies-->
<string name="preference_enhanced_tracking_protection_custom_cookies_4">Усе кукі (будзе перашкаджаць працы сайтаў)</string>
<!-- Preference for enhanced tracking protection for the custom protection settings for tracking content -->
<string name="preference_enhanced_tracking_protection_custom_tracking_content">Элементы сачэння</string>
<!-- Option for enhanced tracking protection for the custom protection settings for tracking content-->
<string name="preference_enhanced_tracking_protection_custom_tracking_content_1">Ва ўсіх картках</string>
<!-- Option for enhanced tracking protection for the custom protection settings for tracking content-->
<string name="preference_enhanced_tracking_protection_custom_tracking_content_2">Толькі ў прыватных картках</string>
<!-- Preference for enhanced tracking protection for the custom protection settings -->
<string name="preference_enhanced_tracking_protection_custom_cryptominers">Майнеры крыптавалют</string>
<!-- Preference for enhanced tracking protection for the custom protection settings -->
<string name="preference_enhanced_tracking_protection_custom_fingerprinters">Збіральнікі лічбавых адбіткаў</string>
<string name="enhanced_tracking_protection_blocked">Заблакаваны</string>
<!-- Header for categories that are being not being blocked by current Enhanced Tracking Protection settings -->
<string name="enhanced_tracking_protection_allowed">Дазволены</string>
<!-- Category of trackers (social media trackers) that can be blocked by Enhanced Tracking Protection -->
<string name="etp_social_media_trackers_title">Трэкеры сацыяльных сетак</string>
<!-- Category of trackers (cross-site tracking cookies) that can be blocked by Enhanced Tracking Protection -->
<string name="etp_cookies_title">Міжсайтавыя кукі асочвання</string>
<!-- Category of trackers (cryptominers) that can be blocked by Enhanced Tracking Protection -->
<string name="etp_cryptominers_title">Майнеры крыптавалют</string>
<!-- Category of trackers (fingerprinters) that can be blocked by Enhanced Tracking Protection -->
<string name="etp_fingerprinters_title">Збіральнікі лічбавых адбіткаў</string>
<!-- Category of trackers (tracking content) that can be blocked by Enhanced Tracking Protection -->
<string name="etp_tracking_content_title">Змест з элементамі сачэння</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Узмоцненая ахова ад сачэння выключана на гэтых сайтах</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Перайсці назад</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Вашы правы</string>
<!-- About page link text to open what's new link -->
<string name="about_whats_new">Што новага ў %s</string>
<!-- About page link text to open support link -->
<string name="about_support">Падтрымка</string>
<!-- About page link text to list of past crashes (like about:crashes on desktop) -->
@ -489,15 +878,48 @@
<!-- About page link text to open privacy notice link -->
<string name="about_privacy_notice">Паведамленне аб прыватнасці</string>
<!-- About page link text to open know your rights link -->
<string name="about_know_your_rights">Ведай свае правы</string>
<!-- About page link text to open licensing information link -->
<string name="about_licensing_information">Звесткі пра ліцэнзію</string>
<!-- Content description of the tab counter toolbar button when one tab is open -->
<string name="tab_counter_content_description_one_tab">1 картка</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</string>
<!-- Browser long press popup menu -->
<!-- Copy the current url -->
<string name="browser_toolbar_long_press_popup_copy">Капіраваць</string>
<!-- Paste & go the text in the clipboard. '&amp;' is replaced with the ampersand symbol: & -->
<string name="browser_toolbar_long_press_popup_paste_and_go">Уставіць і перайсці</string>
<!-- Paste the text in the clipboard -->
<string name="browser_toolbar_long_press_popup_paste">Уставіць</string>
<!-- Snackbar message shown after an URL has been copied to clipboard. -->
<string name="browser_toolbar_url_copied_to_clipboard_snackbar">URL скапіраваны ў буфер абмену</string>
<!-- Add button text for the Add to Homescreen dialog -->
<string name="add_to_homescreen_add">Дадаць</string>
<!-- Preference for managing the settings for logins and passwords in Fenix -->
<string name="preferences_passwords_logins_and_passwords">Лагіны і паролі</string>
<!-- Preference for managing the saving of logins and passwords in Fenix -->
<string name="preferences_passwords_save_logins">Захаванне лагінаў і пароляў</string>
<!-- Preference to access list of login exceptions that we never save logins for -->
<string name="preferences_passwords_exceptions">Выключэнні</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>
<!-- Label that indicates a site is using a secure connection -->
<string name="quick_settings_sheet_secure_connection">Бяспечнае злучэнне</string>
<!-- Label that indicates a site is using a insecure connection -->
<string name="quick_settings_sheet_insecure_connection">Не бяспечнае злучэнне</string>
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">OK, зразумела</string>
</resources>

View File

@ -15,14 +15,17 @@
<string name="content_description_disable_private_browsing_button">Desactiva la navegació privada</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Escriviu una cerca o adreça</string>
<!-- No Open Tabs Message Header -->
<string name="no_open_tabs_header_2">No hi ha cap pestanya oberta</string>
<!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">Les pestanyes obertes es mostraran aquí.</string>
<!-- No Private Tabs Message Description -->
<string name="no_private_tabs_description">Les pestanyes privades es mostraran aquí.</string>
<!-- Message announced to the user when tab tray is selected with 1 tab -->
<string name="open_tab_tray_single">1 pestanya oberta. Toqueu per canviar de pestanya.</string>
<!-- Message announced to the user when tab tray is selected with 0 or 2+ tabs -->
<string name="open_tab_tray_plural">%1$s pestanyes obertes. Toqueu per canviar de pestanya.</string>
<!-- About content. The first parameter is the name of the application. (For example: Fenix) -->
<string name="about_content">El %1$s està creat per Mozilla.</string>
@ -296,7 +299,7 @@
<!-- Preference for syncing logins -->
<string name="preferences_sync_logins">Inicis de sessió</string>
<!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs">Pestanyes</string>
<string name="preferences_sync_tabs_2">Pestanyes obertes</string>
<!-- Preference for signing out -->
<string name="preferences_sign_out">Tanca la sessió</string>
<!-- Preference displays and allows changing current FxA device name -->
@ -482,7 +485,7 @@
<!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">Comparteix les pestanyes</string>
<!-- Open tabs menu item to save tabs to collection -->
<string name="tabs_menu_save_to_collection">Desa a la col·lecció</string>
<string name="tabs_menu_save_to_collection1">Desa les pestanyes a la col·lecció</string>
<!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">Menú de pestanya</string>
<!-- Tab menu item to share the tab -->
@ -695,16 +698,14 @@
<string name="delete_browsing_data_quit_off">Desactivat</string>
<!-- Collections -->
<!-- Label to describe what collections are to a new user without any collections -->
<string name="collections_description">Recolliu allò que us importa. Per començar, deseu les pestanyes obertes en una col·lecció nova.</string>
<!-- Collections header on home fragment -->
<string name="collections_header">Col·leccions</string>
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed -->
<string name="collection_menu_button_content_description">Menú de col·lecció</string>
<!-- No Open Tabs Message Header -->
<string name="no_collections_header">Cap col·lecció</string>
<!-- No Open Tabs Message Description -->
<string name="no_collections_description">Les vostres col·leccions es mostraran aquí.</string>
<string name="no_collections_header1">Recolliu tot allò que us insteressa</string>
<!-- Label to describe what collections are to a new user without any collections -->
<string name="no_collections_description1">Agrupeu les cerques, els llocs i les pestanyes similars per accedir-hi ràpidament en el futur.</string>
<!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">Trieu les pestanyes</string>
<!-- Title for the "select collection" step of the collection creator -->
@ -913,8 +914,9 @@
<!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description">El Firefox Nightly sactualitza cada nit i té característiques noves experimentals.
Tot i això, pot ser menys estable. Baixeu el navegador beta per a una experiència més estable.</string>
<!-- text for firefox preview moving tip button. "Mozilla Firefox Browser" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_button">Baixeu el navegador Mozilla Firefox</string>
<!-- text for firefox preview moving tip button. "Firefox for Android Beta" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_button_2">Baixeu el Firefox per a lAndroid Beta</string>
<!-- text for firefox preview moving tip header. "Firefox Nightly" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header_preview_installed">El Firefox Nightly sha traslladat</string>
@ -1420,6 +1422,9 @@
<!-- Voice search prompt description displayed after the user presses the voice search button -->
<string name="voice_search_explainer">Parleu ara</string>
<!-- The error message in edit login view when a duplicate username exists. -->
<string name="saved_login_duplicate">Ja existeix un inici de sessió amb aquest nom dusuari</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Connecteu-vos amb un Compte del Firefox.</string>
@ -1430,4 +1435,19 @@
<!-- Text displayed when user has disabled tab syncing in Firefox Sync Account -->
<string name="synced_tabs_enable_tab_syncing">Activeu la sincronització de pestanyes.</string>
<!-- Text displayed when user has no tabs that have been synced -->
<string name="synced_tabs_no_tabs">No teniu cap pestanya oberta al Firefox dels altres dispositius.</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">Vegeu una llista de les pestanyes que teniu obertes en altres dispositius.</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">Inicia la sessió per sincronitzar</string>
<!-- Top Sites -->
<!-- Title text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_title">Sha arribat al límit de llocs principals</string>
<!-- Content description text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_content">Per afegir un lloc principal nou, primer cal que nelimineu algun altre. Manteniu premut el lloc i seleccioneu eliminar-lo.</string>
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Entesos</string>
</resources>

View File

@ -16,11 +16,12 @@
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">検索語またはアドレスを入力</string>
<!-- No Open Tabs Message Header -->
<string name="no_open_tabs_header_2">表示タブなし</string>
<!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">開いているタブがここに表示されます。</string>
<!-- No Private Tabs Message Description -->
<string name="no_private_tabs_description">プライベートタブがここに表示されます。</string>
<!-- About content. The first parameter is the name of the application. (For example: Fenix) -->
<string name="about_content">%1$s は Mozilla の製品です。</string>
@ -36,7 +37,7 @@
<!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">セッションを削除</string>
<!-- Private mode shortcut "contextual feature recommender" (CFR) -->
<!-- Private mode shortcut "contextual feature recommendation" (CFR) -->
<!-- Text for the main message -->
<string name="cfr_message">プライベートタブを開くショートカットをホーム画面に追加します。</string>
<!-- Text for the positive button -->
@ -44,6 +45,14 @@
<!-- Text for the negative button -->
<string name="cfr_neg_button_text">追加しない</string>
<!-- Search widget "contextual feature recommendation" (CFR) -->
<!-- Text for the main message. 'Firefox' intentionally hardcoded here.-->
<string name="search_widget_cfr_message">Firefox にすばやくアクセス。ウィジェットをホーム画面に追加してください。</string>
<!-- Text for the positive button -->
<string name="search_widget_cfr_pos_button_text">ウィジェットを追加</string>
<!-- Text for the negative button -->
<string name="search_widget_cfr_neg_button_text">後で</string>
<!-- Home screen icons - Long press shortcuts -->
<!-- Shortcut action to open new tab -->
<string name="home_screen_shortcut_open_new_tab_2">新しいタブ</string>
@ -86,6 +95,8 @@
<string name="browser_menu_add_to_homescreen">ホーム画面に追加</string>
<!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. -->
<string name="browser_menu_install_on_homescreen">インストール</string>
<!-- Menu option on the toolbar that takes you to synced tabs page-->
<string name="synced_tabs">同期したタブ</string>
<!-- Browser menu button that opens the find in page menu -->
<string name="browser_menu_find_in_page">ページ内検索</string>
<!-- Browser menu button that creates a private tab -->
@ -94,8 +105,6 @@
<string name="browser_menu_new_tab">新しいタブ</string>
<!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">コレクションに保存</string>
<!-- Browser menu button that opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">サイトの問題を報告</string>
<!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">共有</string>
<!-- Share menu title, displayed when a user is sharing their current site -->
@ -111,8 +120,10 @@
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="browser_menu_powered_by2">Powered by %1$s</string>
<!-- Browser menu button to put the the current page in reader mode -->
<!-- Browser menu button to put the current page in reader mode -->
<string name="browser_menu_read">リーダービュー</string>
<!-- Browser menu button content description to close reader mode and return the user to the regular browser -->
<string name="browser_menu_read_close">リーダービューを閉じる</string>
<!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">アプリで開く</string>
<!-- Browser menu button to configure reader mode appearance e.g. the used font type and size -->
@ -256,6 +267,8 @@
<string name="preferences_show_search_shortcuts">検索ショートカットを表示</string>
<!-- Preference title for switch preference to show search suggestions -->
<string name="preferences_show_search_suggestions">検索語句の候補を表示</string>
<!-- Preference title for switch preference to show voice search button -->
<string name="preferences_show_voice_search">音声検索を表示</string>
<!-- Preference title for switch preference to show search suggestions also in private mode -->
<string name="preferences_show_search_suggestions_in_private">プライベートセッションで表示する</string>
<!-- Preference title for switch preference to show a clipboard suggestion when searching -->
@ -284,6 +297,8 @@
<string name="preferences_sync_bookmarks">ブックマーク</string>
<!-- Preference for syncing logins -->
<string name="preferences_sync_logins">ログイン情報</string>
<!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs_2">タブを開く</string>
<!-- Preference for signing out -->
<string name="preferences_sign_out">ログアウト</string>
<!-- Preference displays and allows changing current FxA device name -->
@ -378,7 +393,7 @@
<!-- Pairing Feature strings -->
<!-- Instructions on how to access pairing -->
<string name="pair_instructions"><![CDATA[Firefox で <b>firefox.com/pair</b> のサイトにアクセスして QR コードを取得してください。]]></string>
<string name="pair_instructions_2"><![CDATA[<b>firefox.com/pair</b> で表示された QR コードをスキャンしてください]]></string>
<!-- Button to open camera for pairing -->
<string name="pair_open_camera">カメラを開く</string>
<!-- Button to cancel pairing -->
@ -419,12 +434,12 @@
<string name="library_desktop_bookmarks_unfiled">他のブックマーク</string>
<!-- Option in Library to open History page -->
<string name="library_history">履歴</string>
<!-- Option in Library to open Synced Tabs page -->
<string name="library_synced_tabs">同期したタブ</string>
<!-- Option in Library to open Reading List -->
<string name="library_reading_list">リーディングリスト</string>
<!-- Menu Item Label for Search in Library -->
<string name="library_search">検索</string>
<!-- Library Page Title -->
<string name="library_title">ブラウジングライブラリー</string>
<!-- Settings Page Title -->
<string name="settings_title">設定</string>
<!-- Content description (not visible, for screen readers etc.): "Menu icon for items on a history item" -->
@ -441,6 +456,26 @@
<string name="tabs_header_private_tabs_title">プライベートタブ</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_tab">タブを追加</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_private_tab">プライベートタブを追加</string>
<!-- Text for the new tab button to indicate adding a new private tab in the tab -->
<string name="tab_drawer_fab_content">プライベート</string>
<!-- Text shown as the title of the open tab tray -->
<string name="tab_tray_title">開いているタブ</string>
<!-- Text shown in the menu for saving tabs to a collection -->
<string name="tab_tray_menu_item_save">コレクションに保存</string>
<!-- Text shown in the menu for sharing all tabs -->
<string name="tab_tray_menu_item_share">すべてのタブを共有</string>
<!-- Text shown in the menu for closing all tabs -->
<string name="tab_tray_menu_item_close">すべてのタブを閉じる</string>
<!-- Shortcut action to open new tab -->
<string name="tab_tray_menu_open_new_tab">新しいタブ</string>
<!-- Shortcut action to open the home screen -->
<string name="tab_tray_menu_home">ホーム画面を開く</string>
<!-- Shortcut action to toggle private mode -->
<string name="tab_tray_menu_toggle">タブモードを切り替え</string>
<!-- Content description (not visible, for screen readers etc.): Removes tab from collection button. Removes the selected tab from collection when pressed -->
<string name="remove_tab_from_collection">タブをコレクションから削除</string>
<!-- Content description (not visible, for screen readers etc.): Close tab button. Closes the current session when pressed -->
<string name="close_tab">タブを閉じる</string>
<!-- Content description (not visible, for screen readers etc.): Close tab <title> button. First parameter is tab title -->
@ -452,7 +487,7 @@
<!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">タブを共有</string>
<!-- Open tabs menu item to save tabs to collection -->
<string name="tabs_menu_save_to_collection">コレクションに保存</string>
<string name="tabs_menu_save_to_collection1">タブをコレクションに保存</string>
<!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">タブメニュー</string>
<!-- Tab menu item to share the tab -->
@ -671,16 +706,10 @@
<string name="delete_browsing_data_quit_off">オフ</string>
<!-- Collections -->
<!-- Label to describe what collections are to a new user without any collections -->
<string name="collections_description">あなたにとって価値のあるものを収集します。開始するには、開いているタブを新しいコレクションに保存します。</string>
<!-- Collections header on home fragment -->
<string name="collections_header">コレクション</string>
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed -->
<string name="collection_menu_button_content_description">コレクションメニュー</string>
<!-- No Open Tabs Message Header -->
<string name="no_collections_header">コレクションはありません</string>
<!-- No Open Tabs Message Description -->
<string name="no_collections_description">あなたのコレクションがここに表示されます。</string>
<!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">タブの選択</string>
@ -826,14 +855,14 @@
<string name="preference_accessibility_font_size_title">フォントサイズ</string>
<!-- Title for Accessibility Text Automatic Size Scaling Preference -->
<string name="preference_accessibility_auto_size">フォントサイズを自動設定</string>
<string name="preference_accessibility_auto_size_2">フォントサイズを自動調整</string>
<!-- Summary for Accessibility Text Automatic Size Scaling Preference -->
<string name="preference_accessibility_auto_size_summary">フォントサイズは Android の設定に従います。このフォントサイズの管理は無効化されます。</string>
<!-- Title for the Delete browsing data preference -->
<string name="preferences_delete_browsing_data">ブラウジングデータを削除</string>
<!-- Title for the tabs item in Delete browsing data -->
<string name="preferences_delete_browsing_data_tabs_title">開いているタブ</string>
<string name="preferences_delete_browsing_data_tabs_title_2">開いているタブ</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 個のタブ</string>
<!-- Title for the data and history items in Delete browsing data -->
@ -890,8 +919,6 @@
<!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description">Firefox Nightly は毎晩更新され、実験的な新しい機能がテストされています。
しかし、これは安定性に欠けるため、より安定したバージョンを使用したい場合はベータ版のダウンロードをおすすめします。</string>
<!-- text for firefox preview moving tip button. "Mozilla Firefox Browser" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_button">Mozilla Firefox ブラウザーを入手しましょう</string>
<!-- text for firefox preview moving tip header. "Firefox Nightly" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header_preview_installed">Firefox Nightly は移転しました</string>
@ -944,19 +971,8 @@
<string name="onboarding_firefox_account_sync_is_on">Sync が有効です</string>
<!-- text to display in the snackbar if automatic sign-in fails. user may try again -->
<string name="onboarding_firefox_account_automatic_signin_failed">ログインに失敗しました</string>
<!-- text for the tracking protection onboarding card header -->
<string name="onboarding_tracking_protection_header">自己防衛しよう</string>
<!-- text for the tracking protection card description
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_tracking_protection_description1">%s がウェブサイトによるオンラインでのユーザー追跡を止めるのに役立ちます。</string>
<!-- text for tracking protection radio button option for standard level of blocking -->
<string name="onboarding_tracking_protection_standard_button">標準</string>
<!-- text for standard blocking option button description -->
<string name="onboarding_tracking_protection_standard_button_description">ブロックするトラッカーの数は少なくなりますが、ページを正常に読み込めます</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">厳格 (推奨)</string>
<!-- text for strict blocking option button description -->
<string name="onboarding_tracking_protection_strict_button_description">ユーザー保護とパフォーマンス向上のために、より多くのトラッカーをブロックしますが、一部のサイトが正常に動作しない可能性があります。</string>
<!-- text for the toolbar position card header
In English this is an idiom for "choose a side as in an argument or fight"
but it is ok to make this more literally about "choosing a position in a physical space -->
@ -1040,32 +1056,14 @@
<string name="preference_enhanced_tracking_protection_explanation">個人データの収集を防止します。%s はオンラインでのあなたの行動を追跡するよく知られた数多くのトラッカーからあなたを守ります。</string>
<!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">詳細情報</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_option">標準</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard">標準 (推奨)</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description">追跡防止とパフォーマンスを均等にします。</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description_2">ページは正常に読み込まれますが、ブロックされるトラッカーが少なくなります。</string>
<!-- Accessibility text for the Standard protection information icon -->
<string name="preference_enhanced_tracking_protection_standard_info_button">標準のトラッキング防止でブロックされるもの</string>
<!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">厳格</string>
<!-- Preference for enhanced tracking protection for the strict protection settings, default setting -->
<string name="preference_enhanced_tracking_protection_strict_default">厳格 (既定)</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_default_description">トラッキング防止を強力にし、パフォーマンスを高速化します。ただし、一部のサイトが正常に機能しなくなる可能性があります。</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_strict_recommended">厳格 (推奨)</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_description">強力な追跡防止。ただし、一部のサイトまたはコンテンツが破損する可能性があります。</string>
<!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_strict_info_button">厳格なトラッキング防止でブロックされるもの</string>
<!-- Preference for enhanced tracking protection for the custom protection settings -->
<string name="preference_enhanced_tracking_protection_custom">カスタム</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_custom_description">ブロックするトラッカーとスクリプトを選択してください</string>
<!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_custom_info_button">カスタム設定のトラッキング防止でブロックされるもの</string>
<!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings -->
@ -1114,8 +1112,6 @@
<string name="etp_tracking_content_title">トラッキングコンテンツ</string>
<!-- Description of tracking content that can be blocked by Enhanced Tracking Protection -->
<string name="etp_tracking_content_description">追跡コードを含む外部の広告、動画、その他のコンテンツの読み込みを停止します。一部のウェブサイトの機能に影響する場合があります。</string>
<!-- Enhanced Tracking Protection Onboarding Message shown in a dialog above the toolbar. The first parameter is the name of the application (For example: Fenix) -->
<string name="etp_onboarding_message_2">盾が紫色の時は、%s がこのサイト上のトラッカーをブロックしています。ブロックしているものを確認するには盾をタップしてください。</string>
<!-- Enhanced Tracking Protection message that protection is currently on for this site -->
<string name="etp_panel_on">このサイトでは保護が有効になっています</string>
<!-- Enhanced Tracking Protection message that protection is currently off for this site -->
@ -1137,6 +1133,8 @@
<!-- About page link text to open support link -->
<string name="about_support">サポート</string>
<!-- About page link text to list of past crashes (like about:crashes on desktop) -->
<string name="about_crashes">クラッシュ</string>
<!-- About page link text to open privacy notice link -->
<string name="about_privacy_notice">個人情報保護方針</string>
<!-- About page link text to open know your rights link -->
@ -1274,6 +1272,13 @@
<!-- Summary for Accessibility Force Enable Zoom Preference -->
<string name="preference_accessibility_force_enable_zoom_summary">ピンチとズームを有効にします。このジェスチャーが止められているウェブサイトでも有効です。</string>
<!-- Saved logins sorting strategy menu item -by name- (if selected, it will sort saved logins alphabetically) -->
<string name="saved_logins_sort_strategy_alphabetically">名前 (昇順)</string>
<!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) -->
<string name="saved_logins_sort_strategy_last_used">最終使用日時</string>
<!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon -->
<string name="saved_logins_menu_dropdown_chevron_icon_content_description">ログイン情報メニューの並べ替え</string>
<!-- Title of the Add search engine screen -->
<string name="search_engine_add_custom_search_engine_title">検索エンジンの追加</string>
<!-- Title of the Edit search engine screen -->
@ -1365,8 +1370,40 @@
<string name="certificate_info_verified_by">認証局: %1$s</string>
<!-- Login overflow menu delete button -->
<string name="login_menu_delete_button">削除</string>
<!-- Login overflow menu edit button -->
<string name="login_menu_edit_button">編集</string>
<!-- Message in delete confirmation dialog for logins -->
<string name="login_deletion_confirmation">このログイン情報を削除してもよろしいですか?</string>
<!-- Positive action of a dialog asking to delete -->
<string name="dialog_delete_positive">削除</string>
</resources>
<!-- The saved login options menu description. -->
<string name="login_options_menu">ログインオプション</string>
<!-- The editable text field for a login's web address. -->
<string name="saved_login_hostname_description">ログイン情報のウェブアドレスの編集可能なテキストフィールド。</string>
<!-- The editable text field for a login's username. -->
<string name="saved_login_username_description">ログイン情報のユーザー名の編集可能なテキストフィールド。</string>
<!-- The editable text field for a login's password. -->
<string name="saved_login_password_description">ログイン情報のパスワードの編集可能なテキストフィールド。</string>
<!-- The button description to save changes to an edited login. -->
<string name="save_changes_to_login">変更を保存してログインします。</string>
<!-- The button description to discard changes to an edited login. -->
<string name="discard_changes">変更を破棄</string>
<!-- The page title for editing a saved login. -->
<string name="edit">編集</string>
<!-- The error message in edit login view when password field is blank. -->
<string name="saved_login_password_required">パスワードが必要です</string>
<!-- Voice search button content description -->
<string name="voice_search_content_description">音声検索</string>
<!-- Voice search prompt description displayed after the user presses the voice search button -->
<string name="voice_search_explainer">話してください</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Firefox アカウントで接続してください。</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">他の端末を接続してください。</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">再認証してください。</string>
</resources>

View File

@ -13,14 +13,17 @@
<string name="content_description_disable_private_browsing_button">პირადი თვალიერების გამორთვა</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">მოძებნეთ ან შეიყვანეთ მისამართი</string>
<!-- No Open Tabs Message Header -->
<string name="no_open_tabs_header_2">გახსნილი ჩანართები არაა</string>
<!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">თქვენი გახსნილი ჩანართები გამოჩნდება აქ.</string>
<!-- No Private Tabs Message Description -->
<string name="no_private_tabs_description">თქვენი პირადი ჩანართები გამოჩნდება აქ.</string>
<!-- Message announced to the user when tab tray is selected with 1 tab -->
<string name="open_tab_tray_single">1 გახსნილი ჩანართი. შეეხეთ ჩანართების გადასართველად.</string>
<!-- Message announced to the user when tab tray is selected with 0 or 2+ tabs -->
<string name="open_tab_tray_plural">%1$s გახსნილი ჩანართი. შეეხეთ ჩანართების გადასართველად.</string>
<!-- About content. The first parameter is the name of the application. (For example: Fenix) -->
<string name="about_content">%1$s შექმნა Mozilla-მ.</string>
@ -103,8 +106,6 @@
<string name="browser_menu_new_tab">ახალი ჩანართი</string>
<!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">კრებულში შენახვა</string>
<!-- Browser menu button that opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">მოხსენება საიტზე</string>
<!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">გაზიარება</string>
<!-- Share menu title, displayed when a user is sharing their current site -->
@ -118,8 +119,10 @@
<!-- Browser menu text shown in custom tabs to indicate this is a Fenix tab
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="browser_menu_powered_by2">უზრუნველყოფს %1$s</string>
<!-- Browser menu button to put the the current page in reader mode -->
<!-- Browser menu button to put the current page in reader mode -->
<string name="browser_menu_read">კითხვის რეჟიმი</string>
<!-- Browser menu button content description to close reader mode and return the user to the regular browser -->
<string name="browser_menu_read_close">კითხვის რეჟიმის დახურვა</string>
<!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">გახსნა პროგრამით</string>
<!-- Browser menu button to configure reader mode appearance e.g. the used font type and size -->
@ -293,7 +296,7 @@
<!-- Preference for syncing logins -->
<string name="preferences_sync_logins">ანგარიშები</string>
<!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs">ჩანართები</string>
<string name="preferences_sync_tabs_2">გახსნილი ჩანართები</string>
<!-- Preference for signing out -->
<string name="preferences_sign_out">გამოსვლა</string>
<!-- Preference displays and allows changing current FxA device name -->
@ -449,6 +452,24 @@
<string name="tabs_header_private_tabs_title">პირადი ჩანართები</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_tab">ჩანართის დამატება</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_private_tab">პირადი ჩანართის დამატება</string>
<!-- Text for the new tab button to indicate adding a new private tab in the tab -->
<string name="tab_drawer_fab_content">პირადი</string>
<!-- Text shown as the title of the open tab tray -->
<string name="tab_tray_title">გახსნილი ჩანართები</string>
<!-- Text shown in the menu for saving tabs to a collection -->
<string name="tab_tray_menu_item_save">კრებულში შენახვა</string>
<!-- Text shown in the menu for sharing all tabs -->
<string name="tab_tray_menu_item_share">ყველა ჩანართის გაზიარება</string>
<!-- Text shown in the menu for closing all tabs -->
<string name="tab_tray_menu_item_close">ყველა ჩანართის დახურვა</string>
<!-- Shortcut action to open new tab -->
<string name="tab_tray_menu_open_new_tab">ახალი ჩანართი</string>
<!-- Shortcut action to open the home screen -->
<string name="tab_tray_menu_home">მთავარზე გადასვლა</string>
<!-- Shortcut action to toggle private mode -->
<string name="tab_tray_menu_toggle">ჩანართის რეჟიმის გადართვა</string>
<!-- Content description (not visible, for screen readers etc.): Removes tab from collection button. Removes the selected tab from collection when pressed -->
<string name="remove_tab_from_collection">ჩანართის მოცილება კრებულიდან</string>
<!-- Content description (not visible, for screen readers etc.): Close tab button. Closes the current session when pressed -->
@ -462,7 +483,7 @@
<!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">ჩანართების გაზიარება</string>
<!-- Open tabs menu item to save tabs to collection -->
<string name="tabs_menu_save_to_collection">კრებულში შენახვა</string>
<string name="tabs_menu_save_to_collection1">ჩანართების კრებულში შენახვა</string>
<!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">ჩანართის მენიუ</string>
<!-- Tab menu item to share the tab -->
@ -675,17 +696,14 @@
<string name="delete_browsing_data_quit_off">გამორთ.</string>
<!-- Collections -->
<!-- Label to describe what collections are to a new user without any collections -->
<string name="collections_description">შეკრიბეთ რაც მნიშვნელოვანია თქვენთვის. დასაწყებად, შეინახეთ გახსნილი ჩანართები ახალ კრებულში.</string>
<!-- Collections header on home fragment -->
<string name="collections_header">კრებულები</string>
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed -->
<string name="collection_menu_button_content_description">კრებულის მენიუ</string>
<!-- No Open Tabs Message Header -->
<string name="no_collections_header">კრებულები არა</string>
<!-- No Open Tabs Message Description -->
<string name="no_collections_description">თქვენი კრებულები გამოჩნდება აქ.</string>
<string name="no_collections_header1">შეაგროვეთ, რაც თქვენთვის მნიშვნელოვანი</string>
<!-- Label to describe what collections are to a new user without any collections -->
<string name="no_collections_description1">თავი მოუყარეთ მოძიებულ მასალებს, საიტებს, ჩანართებს, სწრაფი წვდომისთვის.</string>
<!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">ჩანართების შერჩევა</string>
<!-- Title for the "select collection" step of the collection creator -->
@ -715,6 +733,9 @@
<!-- Button to save currently selected tabs in the "select tabs" step of the collection creator-->
<string name="create_collection_save">შენახვა</string>
<!-- Snackbar action to view the collection the user just created or updated -->
<string name="create_collection_view">ჩვენება</string>
<!-- Default name for a new collection in "name new collection" step of the collection creator. %d is a placeholder for the number of collections-->
<string name="create_collection_default_name">კრებული %d</string>
@ -889,8 +910,9 @@
<!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description">Firefox Nightly ახლდება ყოველ ღამე და აქვს საცდელი შესაძლებლობები.
თუმცა, შესაძლოა ნაკლებ მდგრადი იყოს. ჩამოტვირთეთ beta მეტი მდგრადობისთვის.</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 button. "Firefox for Android Beta" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_button_2">გადმოწერეთ Firefox Android Beta</string>
<!-- text for firefox preview moving tip header. "Firefox Nightly" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header_preview_installed">Firefox Nightly ჩანაცვლებულია</string>
@ -943,22 +965,22 @@
<string name="onboarding_firefox_account_sync_is_on">სინქრონიზაცია ჩართულია</string>
<!-- text to display in the snackbar if automatic sign-in fails. user may try again -->
<string name="onboarding_firefox_account_automatic_signin_failed">შესვლა ვერ მოხერხდა</string>
<!-- text for the tracking protection onboarding card header -->
<string name="onboarding_tracking_protection_header">დაიცავით თავი</string>
<string name="onboarding_tracking_protection_header_2">თავისთავადი პირადულობა</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>
<string name="onboarding_tracking_protection_description_2">პირადულობისა და უსაფრთხოების პარამეტრები უზღუდავს მეთვალყურეებს, მავნებლებს და კომპანიებს, თქვენზე თვალის დევნებას.</string>
<!-- text for tracking protection radio button option for standard level of blocking -->
<string name="onboarding_tracking_protection_standard_button">ჩვეულებრივი</string>
<string name="onboarding_tracking_protection_standard_button_2">ჩვეულებრივი (ნაგულისხმევი)</string>
<!-- text for standard blocking option button description -->
<string name="onboarding_tracking_protection_standard_button_description">შეიზღუდება ნაკლები მეთვალყურე, მაგრამ გვერდები ჩვეულებრივ გაიხსნება</string>
<string name="onboarding_tracking_protection_standard_button_description_2">ზღუდავს ნაკლებ მეთვალყურეს. გვერდები ჩვეულებრივ გაიხსნება.</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">მკაცრი (სასურველი)</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_option">მკაცრი</string>
<!-- text for strict blocking option button description -->
<string name="onboarding_tracking_protection_strict_button_description">შეიზღუდება მეტი მეთვალყურე უკეთესი დაცვისა და სიჩქარისთვის, მაგრამ შესაძლოა ზოგიერთი საიტის გაუმართაობა გამოიწვიოს</string>
<string name="onboarding_tracking_protection_strict_button_description_2">ზღუდავს მეტ მეთვალყურეს, ამომხტომს, რეკლამას. გვერდები უფრო სწრაფად გაიხსნება, მაგრამ შესაძლოა, ოდნავ გაუმართავი იყოს.</string>
<!-- text for the toolbar position card header
In English this is an idiom for "choose a side as in an argument or fight"
but it is ok to make this more literally about "choosing a position in a physical space -->
@ -1046,31 +1068,21 @@
<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>
<string name="preference_enhanced_tracking_protection_standard_default_1">ჩვეულებრივი (ნაგულისხმევი)</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description">წონასწორული, უსაფრთხოებასა და წარმადობას შორის.</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description_2">გვერდები ჩაიტვირთება ჩვეულებრივ, მაგრამ ნაკლები მეთვალყურე იზღუდება.</string>
<string name="preference_enhanced_tracking_protection_standard_description_3">ზღუდავს ნაკლებ მეთვალყურეს. გვერდები ჩვეულებრივ გაიხსნება.</string>
<!-- Accessibility text for the Standard protection information icon -->
<string name="preference_enhanced_tracking_protection_standard_info_button">რა იზღუდება თვალთვალისგან ჩვეულებრივი დაცვით</string>
<!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">მკაცრი</string>
<!-- Preference for enhanced tracking protection for the strict protection settings, default setting -->
<string name="preference_enhanced_tracking_protection_strict_default">მკაცრი (ნაგულისხმევი)</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_default_description">მეტად მძლავრი დაცვა თვალთვალისგან და მეტი სისწრაფე, მაგრამ საიტების ნაწილმა, შესაძლოა გაუმართავად იმუშაოს.</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_strict_recommended">მკაცრი (სასურველი)</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_description">მძლავრი დაცვა, თუმცა გამოიწვევს საიტების ან შიგთავსის ნაწილის გაუმართაობას.</string>
<string name="preference_enhanced_tracking_protection_strict_description_2">ზღუდავს მეტ მეთვალყურეს, ამომხტომს, რეკლამას. გვერდები უფრო სწრაფად გაიხსნება, მაგრამ შესაძლოა, ოდნავ გაუმართავი იყოს.</string>
<!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_strict_info_button">რა იზღუდება თვალთვალისგან მკაცრი დაცვით</string>
<!-- Preference for enhanced tracking protection for the custom protection settings -->
<string name="preference_enhanced_tracking_protection_custom">მორგებული</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_custom_description">აირჩიეთ, რომელი მეთვალყურე საშუალებები შეიზღუდოს</string>
<string name="preference_enhanced_tracking_protection_custom_description_2">აირჩიეთ, რომელი მეთვალყურე საშუალებები შეიზღუდოს.</string>
<!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_custom_info_button">რა იზღუდება თვალთვალისგან მორგებული დაცვით</string>
<!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings -->
@ -1122,7 +1134,7 @@
<!-- Description of tracking content that can be blocked by Enhanced Tracking Protection -->
<string name="etp_tracking_content_description">აჩერებს გარეშე რეკლამების, ვიდეოებისა და სხვა მეთვალყურე კოდის შემცველი შიგთავსის ჩატვირთვას. შეიძლება გავლენა იქონიოს ვებგვერდის ზოგიერთ შესაძლებლობაზე.</string>
<!-- Enhanced Tracking Protection Onboarding Message shown in a dialog above the toolbar. The first parameter is the name of the application (For example: Fenix) -->
<string name="etp_onboarding_message_2">%s ზღუდავს მეთვალყურეებს საიტზე, როცა ფარი იისფერია. შეეხეთ, რომ იხილოთ რა იზღუდება.</string>
<string name="etp_onboarding_cfr_message">როცა ფარი იისფერია, ნიშნავს რომ %s ზღუდავს მეთვალყურეებს საიტზე. შეეხეთ ვრცლად სანახავად.</string>
<!-- Enhanced Tracking Protection message that protection is currently on for this site -->
<string name="etp_panel_on">დაცვა ჩართულია ამ საიტზე</string>
<!-- Enhanced Tracking Protection message that protection is currently off for this site -->
@ -1408,6 +1420,9 @@
<!-- Voice search prompt description displayed after the user presses the voice search button -->
<string name="voice_search_explainer">წარმოთქვით</string>
<!-- The error message in edit login view when a duplicate username exists. -->
<string name="saved_login_duplicate">ანგარიში ამ სახელით უკვე არსებობს</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">დაკავშირება Firefox-ანგარიშით</string>
@ -1418,4 +1433,19 @@
<!-- Text displayed when user has disabled tab syncing in Firefox Sync Account -->
<string name="synced_tabs_enable_tab_syncing">გთხოვთ, ჩართოთ ჩანართების სინქრონიზაცია.</string>
<!-- Text displayed when user has no tabs that have been synced -->
<string name="synced_tabs_no_tabs">თქვენ არ გაქვთ, Firefox-ის გახსნილი ჩანართები, სხვა მოწყობილობებზე.</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">იხილეთ ჩანართების სია თქვენი სხვა მოწყობილობებიდან.</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">სინქრონიზაციაში შესვლა</string>
<!-- Top Sites -->
<!-- Title text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_title">რჩეული საიტების ზღვარი მიღწეულია</string>
<!-- Content description text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_content">ახალი რჩეული საიტის დასამატებლად, წაშალეთ წინა. მასზე დიდხანს დაჭერით და მოცილებით.</string>
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">კარგი, გასაგებია</string>
</resources>

View File

@ -1451,6 +1451,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara
<!-- Top Sites -->
<!-- Title text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_title">Tewwḍeḍ ɣer talast n usmel</string>
<!-- Content description text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_content">I tmerna n usmel afellay amaynut, kkes yiwen. Sit mliḥ ɣef usmel syen fren kkes.</string>
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">IH, awi-t-id</string>

View File

@ -117,6 +117,8 @@
<string name="browser_menu_powered_by2">ขับเคลื่อนโดย %1$s</string>
<!-- Browser menu button to put the current page in reader mode -->
<string name="browser_menu_read">มุมมองผู้อ่าน</string>
<!-- Browser menu button content description to close reader mode and return the user to the regular browser -->
<string name="browser_menu_read_close">ปิดมุมมองผู้อ่าน</string>
<!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">เปิดในแอป</string>
<!-- Browser menu button to configure reader mode appearance e.g. the used font type and size -->
@ -444,6 +446,24 @@
<string name="tabs_header_private_tabs_title">แท็บส่วนตัว</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_tab">เพิ่มแท็บ</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_private_tab">เพิ่มแท็บส่วนตัว</string>
<!-- Text for the new tab button to indicate adding a new private tab in the tab -->
<string name="tab_drawer_fab_content">ส่วนตัว</string>
<!-- Text shown as the title of the open tab tray -->
<string name="tab_tray_title">แท็บที่เปิด</string>
<!-- Text shown in the menu for saving tabs to a collection -->
<string name="tab_tray_menu_item_save">บันทึกไปยังชุดสะสม</string>
<!-- Text shown in the menu for sharing all tabs -->
<string name="tab_tray_menu_item_share">แบ่งปันแท็บทั้งหมด</string>
<!-- Text shown in the menu for closing all tabs -->
<string name="tab_tray_menu_item_close">ปิดแท็บทั้งหมด</string>
<!-- Shortcut action to open new tab -->
<string name="tab_tray_menu_open_new_tab">แท็บใหม่</string>
<!-- Shortcut action to open the home screen -->
<string name="tab_tray_menu_home">ไปยังหน้าแรก</string>
<!-- Shortcut action to toggle private mode -->
<string name="tab_tray_menu_toggle">สลับโหมดแท็บ</string>
<!-- Content description (not visible, for screen readers etc.): Removes tab from collection button. Removes the selected tab from collection when pressed -->
<string name="remove_tab_from_collection">เอาแท็บออกจากชุดสะสม</string>
<!-- Content description (not visible, for screen readers etc.): Close tab button. Closes the current session when pressed -->
@ -456,6 +476,8 @@
<string name="tabs_menu_close_all_tabs">ปิดแท็บทั้งหมด</string>
<!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">แบ่งปันแท็บ</string>
<!-- Open tabs menu item to save tabs to collection -->
<string name="tabs_menu_save_to_collection1">บันทึกแท็บไปยังชุดสะสม</string>
<!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">เมนูแท็บ</string>
<!-- Tab menu item to share the tab -->
@ -700,6 +722,9 @@
<!-- Button to save currently selected tabs in the "select tabs" step of the collection creator-->
<string name="create_collection_save">บันทึก</string>
<!-- Snackbar action to view the collection the user just created or updated -->
<string name="create_collection_view">ดู</string>
<!-- Default name for a new collection in "name new collection" step of the collection creator. %d is a placeholder for the number of collections-->
<string name="create_collection_default_name">ชุดสะสม %d</string>

View File

@ -891,6 +891,84 @@
<!-- Title for the cached images and files item in Delete browsing data -->
<string name="preferences_delete_browsing_data_cached_files">Sa ni\'io\' nī archibô kāchê</string>
<!-- Subtitle for the cached images and files item in Delete browsing data -->
<string name="preferences_delete_browsing_data_cached_files_subtitle">Gī\'iaj hīu hiūj nachrasàt</string>
<!-- Title for the site permissions item in Delete browsing data -->
<string name="preferences_delete_browsing_data_site_permissions">Sa rikî nì\'iaj sîtio</string>
<!-- Text for the button to delete browsing data -->
<string name="preferences_delete_browsing_data_button">Nādure\' nej si datô riña sā nana\'uî\'t</string>
<!-- Title for the Delete browsing data on quit preference -->
<string name="preferences_delete_browsing_data_on_quit">Nādure\' nej si datô riña sā nana\'uî\'t ngà gāhuīt</string>
<!-- Summary for the Delete browsing data on quit preference. "Quit" translation should match delete_browsing_data_on_quit_action translation. -->
<string name="preference_summary_delete_browsing_data_on_quit">Nārè\' man\'an nej si datô riña sā nana\'uî\'t ngà gūru\'man ra\'ât riña tāj “Gāhuīt” riña menú ñāan</string>
<!-- Summary for the Delete browsing data on quit preference. "Quit" translation should match delete_browsing_data_on_quit_action translation. -->
<string name="preference_summary_delete_browsing_data_on_quit_2">Nārè\' man\'an nej si datô riña sā nana\'uî\'t ngà gūru\'man ra\'ât riña tāj \“Gāhuīt\” riña menú ñāan</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">Nej sa gini\'iājt ngà gaché nunt</string>
<!-- Action item in menu for the Delete browsing data on quit feature -->
<string name="delete_browsing_data_on_quit_action">Gāhuī</string>
<!-- Dialog message to the user asking to delete browsing data. -->
<string name="delete_browsing_data_prompt_message">Gānarè\' daran\' nej si datôt ngà gaché nunt.</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 nādure\'ej nej si datô riña gaché nunt ngà naguit.</string>
<!-- Text for the cancel button for the data deletion dialog -->
<string name="delete_browsing_data_prompt_cancel">Dūyichin\'</string>
<!-- Text for the allow button for the data deletion dialog -->
<string name="delete_browsing_data_prompt_allow">Nādūre\'</string>
<!-- Text for the snackbar confirmation that the data was deleted -->
<string name="preferences_delete_browsing_data_snackbar">Ngà ganare\' nej si datô sa nana\'uî\'t</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">Hīaj nadure\'ej nej si datô riña sā nana\'uî\'t…</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 huin Firefox Nightly hīaj</string>
<!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description">Nahuin nākà Firefox Nightly daran\' nìïn nī huā sa gārahuê\' nākàa nika.
Sanī, ga\'ue sī gi\'iaj sun hue\'ej. Nādūnïnj sa nana\'ui\' gù\'nàj beta da\' gā hīa ruhuât doj.</string>
<!-- text for firefox preview moving tip button. "Firefox for Android Beta" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_button_2">Nādūnïnj Firefox guendâ Android Beta</string>
<!-- text for firefox preview moving tip header. "Firefox Nightly" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header_preview_installed">Ngà nasiki\' Firefox Nightly</string>
<!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description_preview_installed">Sī nahuin ra\'a aplikasiûn nan sa nahuin nākà dūgumî sò\' ngà\'. Dūnâj aplikasiûn nan nī nādūnā ngà Nightly nākàa.
\n\nDa\' gānāchīn nej sa arâj sun nīchrà\'t doj, riña ayi\'ì sēsiûn nī sa gini\'iājt riña a\'ngô aplikasiûn, da\'uît gīrīt \'ngō si kuentât Firefox.</string>
<!-- text for firefox preview moving tip button -->
<string name="tip_firefox_preview_moved_button_preview_installed">Nādūnā ngà Nightly nākàa</string>
<!-- text for firefox preview moving tip header. "Firefox Nightly" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header_preview_not_installed">Ngà nasiki\' Firefox Nightly</string>
<!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description_preview_not_installed">Sī nahuin ra\'a aplikasiûn nan sa nahuin nākà dūgumî sò\' ngà\'. Sī garâj sunt aplikasiûn nan ngà\' nī nādūnïnj Nightly nākàa.
\n\nDa\' gānāchīn nej sa arâj sun nīchrà\'t doj, riña ayi\'ì sēsiûn nī sa gini\'iājt riña a\'ngô aplikasiûn, da\'uît gīrīt \'ngō si kuentât Firefox.</string>
<!-- text for firefox preview moving tip button -->
<string name="tip_firefox_preview_moved_button_preview_not_installed">Nādūnïnj Nightly nākàa</string>
<!-- Onboarding -->
<!-- Text for onboarding welcome message
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_header">Guruhuât gunumânt riña %s</string>
<!-- text for the Firefox Accounts section header -->
<string name="onboarding_fxa_section_header">Ngà huā si kuendâ raj?</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">Gānārì\' %s</string>
<!-- text for the "What's New" onboarding card header -->
<string name="onboarding_whats_new_header1">Gīni\'iāj sa huā nākà doj</string>
<!-- text for the "what's new" onboarding card description
The first parameter is the short name of the app (e.g. Firefox) -->
<string name="onboarding_whats_new_description">Huā sa gāchìnj na\'ānjt rayi\'î nùhuin saj nadunâ hua %s aj. Gīni\'înt sa nadunâ ruhuâ raj.</string>
<!-- text for underlined clickable link that is part of "what's new" onboarding card description that links to an FAQ -->
<string name="onboarding_whats_new_description_linktext">Hiūj nan \'na\' nuguan\' ruhuât gīni\'înt</string>
<!-- text for the firefox account onboarding card header
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_firefox_account_header">Nārì\' daran\' sa nīkāj %s.</string>
<!-- Content description (not visible, for screen readers etc.): Close onboarding screen -->
<string name="onboarding_close">Nārán</string>

View File

@ -17,7 +17,7 @@
<string name="no_open_tabs_description">Тут з’являтимуться ваші відкриті вкладки.</string>
<!-- No Private Tabs Message Description -->
<string name="no_private_tabs_description">Тут будуть ваші приватні вкладки.</string>
<string name="no_private_tabs_description">Тут зʼявлятимуться ваші приватні вкладки.</string>
<!-- Message announced to the user when tab tray is selected with 1 tab -->
<string name="open_tab_tray_single">1 відкрита вкладка. Торкніться, щоб перемкнути вкладки.</string>
@ -1137,7 +1137,7 @@
<!-- Category of trackers (cryptominers) that can be blocked by Enhanced Tracking Protection -->
<string name="etp_cryptominers_title">Криптомайнери</string>
<!-- Description of cryptominers that can be blocked by Enhanced Tracking Protection -->
<string name="etp_cryptominers_description">Перешкоджає доступу зловмисних скриптів до вашого пристрою для видобутку цифрової валюти.</string>
<string name="etp_cryptominers_description">Перешкоджає доступу зловмисних скриптів до вашого пристрою для добування криптовалют.</string>
<!-- Category of trackers (fingerprinters) that can be blocked by Enhanced Tracking Protection -->
<string name="etp_fingerprinters_title">Зчитування цифрового відбитка</string>

View File

@ -1342,6 +1342,12 @@
<string name="dialog_delete_positive">حذف کریں</string>
<!-- The saved login options menu description. -->
<string name="login_options_menu">لاگ ان اختیارات</string>
<!-- The editable text field for a login's web address. -->
<string name="saved_login_hostname_description">لاگ ان کے ویب ایڈریس کے لئے یہ تدوین کر سکتے ہیں۔</string>
<!-- The editable text field for a login's username. -->
<string name="saved_login_username_description">لاگ ان کے صارف نام کے لئے یہ تدوین کر سکتے ہیں۔</string>
<!-- The editable text field for a login's password. -->
<string name="saved_login_password_description">لاگ ان کے پاس ورڈ کے لئے یہ تدوین کر سکتے ہیں۔</string>
<!-- The button description to save changes to an edited login. -->
<string name="save_changes_to_login">لاگ ان میں تبدیلیاں محفوظ کریں۔</string>
<!-- The button description to discard changes to an edited login. -->
@ -1371,6 +1377,8 @@
<!-- 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">sync کے لئے سائن ان کریں</string>
<!-- Content description text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_content">نئی ٹاپ سائٹ شامل کرنے کے لئے ، ایک سائٹ کو ہٹائیں۔ سائٹ پر دیر تک دبائیں اور ہٹانا منتخب کریں۔</string>
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">ٹھیک ہے سمجھ گیا</string>

View File

@ -156,5 +156,7 @@
<dimen name="saved_logins_detail_menu_vertical_padding">5dp</dimen>
<dimen name="saved_logins_end_icon_drawable_padding">16dp</dimen>
<!-- a11y -->
<dimen name="accessibility_min_height">48dp</dimen>
</resources>

View File

@ -122,13 +122,13 @@
android:key="@string/pref_key_advanced"
android:layout="@layout/preference_cat_style">
<androidx.preference.Preference
android:icon="@drawable/mozac_ic_extensions_black"
android:icon="@drawable/ic_addons_extensions"
android:key="@string/pref_key_addons"
android:title="@string/preferences_addons" />
<androidx.preference.SwitchPreference
android:defaultValue="false"
android:icon="@drawable/ic_app_links"
android:icon="@drawable/ic_open_in_app"
android:key="@string/pref_key_open_links_in_external_app"
android:title="@string/preferences_open_links_in_apps" />

View File

@ -5,11 +5,14 @@
package org.mozilla.fenix
import android.content.Intent
import android.os.Bundle
import mozilla.components.support.test.robolectric.testContext
import mozilla.components.support.utils.toSafeIntent
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotEquals
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.HomeActivity.Companion.PRIVATE_BROWSING_MODE
@ -58,4 +61,38 @@ class HomeActivityTest {
assertNotEquals(testContext.settings().lastKnownMode, activity.getModeFromIntentOrLastKnown(intent))
assertEquals(BrowsingMode.Private, activity.getModeFromIntentOrLastKnown(intent))
}
@Test
fun `isActivityColdStarted returns true for null savedInstanceState and not launched from history`() {
val activity = HomeActivity()
assertTrue(activity.isActivityColdStarted(Intent(), null))
}
@Test
fun `isActivityColdStarted returns false for valid savedInstanceState and not launched from history`() {
val activity = HomeActivity()
assertFalse(activity.isActivityColdStarted(Intent(), Bundle()))
}
@Test
fun `isActivityColdStarted returns false for null savedInstanceState and launched from history`() {
val activity = HomeActivity()
val startingIntent = Intent().apply {
flags = flags or Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
}
assertFalse(activity.isActivityColdStarted(startingIntent, null))
}
@Test
fun `isActivityColdStarted returns false for null savedInstanceState and not launched from history`() {
val activity = HomeActivity()
val startingIntent = Intent().apply {
flags = flags or Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
}
assertFalse(activity.isActivityColdStarted(startingIntent, Bundle()))
}
}

View File

@ -4,57 +4,165 @@
package org.mozilla.fenix.ext
import android.app.Activity
import android.content.Context
import android.view.ContextThemeWrapper
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.test.core.app.ApplicationProvider
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.mockkStatic
import io.mockk.unmockkObject
import mozilla.components.support.locale.LocaleManager
import mozilla.components.support.locale.LocaleManager.getSystemDefault
import mozilla.components.support.test.robolectric.testContext
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.FenixApplication
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import java.lang.String.format
import java.util.Locale
@RunWith(FenixRobolectricTestRunner::class)
class ContextTest {
private lateinit var context: Context
private lateinit var mockContext: Context
private val selectedLocale = Locale("ro", "RO")
private val appName = "Firefox Preview"
private val correctlyFormattedString = "Incearca noul %1s"
private val incorrectlyFormattedString = "Incearca noul %1&amp;s"
private val englishString = "Try the new %1s"
private val mockId: Int = 11
@Before
fun setup() {
mockkStatic("org.mozilla.fenix.settings.advanced.LocaleManagerExtensionKt")
mockkObject(LocaleManager)
context = mockk(relaxed = true)
context.resources.configuration.setLocale(selectedLocale)
every { LocaleManager.getCurrentLocale(context) } returns selectedLocale
mockContext = mockk(relaxed = true)
mockContext.resources.configuration.setLocale(selectedLocale)
every { LocaleManager.getCurrentLocale(mockContext) } returns selectedLocale
}
@After
fun teardown() {
unmockkObject(LocaleManager)
}
@Test
fun `getStringWithArgSafe returns selected locale for correct formatted string`() {
every { context.getString(mockId) } returns correctlyFormattedString
val correctlyFormattedString = "Incearca noul %1s"
every { mockContext.getString(mockId) } returns correctlyFormattedString
val result = context.getStringWithArgSafe(mockId, appName)
val result = mockContext.getStringWithArgSafe(mockId, appName)
assertEquals("Incearca noul Firefox Preview", result)
}
@Test
fun `getStringWithArgSafe returns English locale for incorrect formatted string`() {
val englishString = "Try the new %1s"
val incorrectlyFormattedString = "Incearca noul %1&amp;s"
every { getSystemDefault() } returns Locale("en")
every { context.getString(mockId) } returns incorrectlyFormattedString
every { format(context.getString(mockId), appName) } returns format(englishString, appName)
every { mockContext.getString(mockId) } returns incorrectlyFormattedString
every { format(mockContext.getString(mockId), appName) } returns format(englishString, appName)
val result = context.getStringWithArgSafe(mockId, appName)
val result = mockContext.getStringWithArgSafe(mockId, appName)
assertEquals("Try the new Firefox Preview", result)
}
@Test
fun `GIVEN context WHEN seeking application of context THEN send back application context`() {
val expectedAppValue = ApplicationProvider.getApplicationContext<FenixApplication>()
assertEquals(expectedAppValue, testContext.application)
}
@Test
fun `GIVEN context WHEN requiring components THEN send back application components`() {
val expectedComponentsValue = ApplicationProvider.getApplicationContext<FenixApplication>().components
assertEquals(expectedComponentsValue, testContext.components)
}
@Test
fun `GIVEN context WHEN getting metrics controller THEN send back metrics`() {
val expectedMetricsValue = ApplicationProvider.getApplicationContext<FenixApplication>().components.analytics.metrics
assertEquals(expectedMetricsValue, testContext.metrics)
}
@Test
fun `GIVEN activity context WHEN make it an activity THEN return activity`() {
val mockActivity = mockk<Activity> {
every { baseContext } returns null
}
val mockContext: Context = mockActivity
assertEquals(mockActivity, mockContext.asActivity())
}
@Test
fun `GIVEN theme wrapper context WHEN make it an activity THEN return base`() {
val mockActivity = mockk<Activity>()
val mockThemeWrapper = mockk<ContextThemeWrapper> {
every { baseContext } returns mockActivity
}
val mockContext: Context = mockThemeWrapper
assertEquals(mockActivity, mockContext.asActivity())
}
@Test
fun `GIVEN theme wrapper context without activity base context WHEN make it an activity THEN return null`() {
val mockThemeWrapper = mockk<ContextThemeWrapper> {
every { baseContext } returns mockk<FenixApplication>()
}
val mockContext: Context = mockThemeWrapper
assertNull(mockContext.asActivity())
}
@Test
fun `GIVEN activity context WHEN get root view THEN return content view`() {
val rootView = mockk<ViewGroup>()
val mockActivity = mockk<Activity> {
every { baseContext } returns null
every { window } returns mockk {
every { decorView } returns mockk {
every { findViewById<View>(android.R.id.content) } returns rootView
}
}
}
assertEquals(rootView, mockActivity.getRootView())
}
@Test
fun `GIVEN activity context without window WHEN get root view THEN return content view`() {
val mockActivity = mockk<Activity> {
every { baseContext } returns null
every { window } returns null
}
assertNull(mockActivity.getRootView())
}
@Test
fun `GIVEN activity context without valid content view WHEN get root view THEN return content view`() {
val mockActivity = mockk<Activity> {
every { baseContext } returns null
every { window } returns mockk {
every { decorView } returns mockk {
every { findViewById<View>(android.R.id.content) } returns mockk<TextView>()
}
}
}
assertNull(mockActivity.getRootView())
}
@Test
fun `GIVEN context WHEN given a preference key THEN send back the right string`() {
val comparisonStr = testContext.getString(R.string.private_browsing_common_myths)
val actualStr = testContext.getPreferenceKey(R.string.private_browsing_common_myths)
assertEquals(comparisonStr, actualStr)
}
}

View File

@ -0,0 +1,165 @@
/* 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.tabtray
import androidx.navigation.NavController
import androidx.navigation.NavDestination
import androidx.navigation.NavDirections
import io.mockk.Runs
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.slot
import io.mockk.verify
import io.mockk.verifyOrder
import mozilla.components.browser.session.Session
import mozilla.components.browser.session.SessionManager
import mozilla.components.feature.tab.collections.TabCollection
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.components.TabCollectionStorage
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.sessionsOfType
class DefaultTabTrayControllerTest {
private val activity: HomeActivity = mockk(relaxed = true)
private val navController: NavController = mockk()
private val sessionManager: SessionManager = mockk(relaxed = true)
private val dismissTabTray: (() -> Unit) = mockk(relaxed = true)
private val showUndoSnackbar: ((String, SessionManager.Snapshot) -> Unit) =
mockk(relaxed = true)
private val registerCollectionStorageObserver: (() -> Unit) = mockk(relaxed = true)
private val tabCollectionStorage: TabCollectionStorage = mockk(relaxed = true)
private val tabCollection: TabCollection = mockk()
private val cachedTabCollections: List<TabCollection> = listOf(tabCollection)
private val currentDestination: NavDestination = mockk(relaxed = true)
private lateinit var controller: DefaultTabTrayController
private val session = Session(
"mozilla.org",
true
)
private val nonPrivateSession = Session(
"mozilla.org",
false
)
@Before
fun setUp() {
mockkStatic("org.mozilla.fenix.ext.SessionManagerKt")
every { activity.components.core.sessionManager } returns sessionManager
every { activity.components.core.tabCollectionStorage } returns tabCollectionStorage
every { sessionManager.sessionsOfType(private = true) } returns listOf(session).asSequence()
every { sessionManager.sessionsOfType(private = false) } returns listOf(nonPrivateSession).asSequence()
every { sessionManager.createSessionSnapshot(any()) } returns SessionManager.Snapshot.Item(
session
)
every { sessionManager.remove(any()) } just Runs
every { tabCollectionStorage.cachedTabCollections } returns cachedTabCollections
every { sessionManager.selectedSession } returns nonPrivateSession
every { navController.navigate(any<NavDirections>()) } just Runs
every { navController.currentDestination } returns currentDestination
every { currentDestination.id } returns R.id.browserFragment
controller = DefaultTabTrayController(
activity = activity,
navController = navController,
dismissTabTray = dismissTabTray,
showUndoSnackbar = showUndoSnackbar,
registerCollectionStorageObserver = registerCollectionStorageObserver
)
}
@Test
fun onNewTabTapped() {
controller.onNewTabTapped(private = false)
verifyOrder {
activity.browsingModeManager.mode = BrowsingMode.fromBoolean(false)
navController.navigate(
TabTrayDialogFragmentDirections.actionGlobalHome(
focusOnAddressBar = true
)
)
dismissTabTray()
}
controller.onNewTabTapped(private = true)
verifyOrder {
activity.browsingModeManager.mode = BrowsingMode.fromBoolean(true)
navController.navigate(
TabTrayDialogFragmentDirections.actionGlobalHome(
focusOnAddressBar = true
)
)
dismissTabTray()
}
}
@Test
fun onTabTrayDismissed() {
controller.onTabTrayDismissed()
verify {
dismissTabTray()
}
}
@Test
fun onSaveToCollectionClicked() {
val navDirectionsSlot = slot<NavDirections>()
every { navController.navigate(capture(navDirectionsSlot)) } just Runs
controller.onSaveToCollectionClicked()
verify {
registerCollectionStorageObserver()
navController.navigate(capture(navDirectionsSlot))
}
assertTrue(navDirectionsSlot.isCaptured)
assertEquals(
R.id.action_global_collectionCreationFragment,
navDirectionsSlot.captured.actionId
)
}
@Test
fun onShareTabsClicked() {
val navDirectionsSlot = slot<NavDirections>()
every { navController.navigate(capture(navDirectionsSlot)) } just Runs
controller.onShareTabsClicked(private = false)
verify {
navController.navigate(capture(navDirectionsSlot))
}
assertTrue(navDirectionsSlot.isCaptured)
assertEquals(R.id.action_global_shareFragment, navDirectionsSlot.captured.actionId)
}
@Test
fun onCloseAllTabsClicked() {
controller.onCloseAllTabsClicked(private = false)
val snackbarMessage = activity.getString(R.string.snackbar_tabs_closed)
verify {
sessionManager.createSessionSnapshot(nonPrivateSession)
sessionManager.remove(nonPrivateSession)
showUndoSnackbar(snackbarMessage, any())
}
}
}

View File

@ -0,0 +1,53 @@
/* 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.tabtray
import io.mockk.mockk
import io.mockk.verify
import org.junit.Test
class TabTrayFragmentInteractorTest {
private val controller = mockk<TabTrayController>(relaxed = true)
private val interactor = TabTrayFragmentInteractor(controller)
@Test
fun onNewTabTapped() {
interactor.onNewTabTapped(private = true)
verify { controller.onNewTabTapped(true) }
interactor.onNewTabTapped(private = false)
verify { controller.onNewTabTapped(false) }
}
@Test
fun onTabTrayDismissed() {
interactor.onTabTrayDismissed()
verify { controller.onTabTrayDismissed() }
}
@Test
fun onShareTabsClicked() {
interactor.onShareTabsClicked(private = true)
verify { controller.onShareTabsClicked(true) }
interactor.onShareTabsClicked(private = false)
verify { controller.onShareTabsClicked(false) }
}
@Test
fun onSaveToCollectionClicked() {
interactor.onSaveToCollectionClicked()
verify { controller.onSaveToCollectionClicked() }
}
@Test
fun onCloseAllTabsClicked() {
interactor.onCloseAllTabsClicked(private = false)
verify { controller.onCloseAllTabsClicked(false) }
interactor.onCloseAllTabsClicked(private = true)
verify { controller.onCloseAllTabsClicked(true) }
}
}

View File

@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
const val VERSION = "47.0.20200618130101"
const val VERSION = "47.0.20200622130109"
}