diff --git a/BrowserKit/Sources/Common/Theming/DarkTheme.swift b/BrowserKit/Sources/Common/Theming/DarkTheme.swift index 20d70a3cbb33..8ac10f01d6ad 100644 --- a/BrowserKit/Sources/Common/Theming/DarkTheme.swift +++ b/BrowserKit/Sources/Common/Theming/DarkTheme.swift @@ -43,10 +43,10 @@ private struct DarkColourPalette: ThemeColourPalette { FXColors.DarkGrey60.withAlphaComponent(1), FXColors.DarkGrey60.withAlphaComponent(1) ]) - var layerInfo: UIColor = FXColors.Blue50 - var layerConfirmation: UIColor = FXColors.Green80 + var layerInformation: UIColor = FXColors.Blue50 + var layerSuccess: UIColor = FXColors.Green80 var layerWarning: UIColor = FXColors.Yellow70.withAlphaComponent(0.77) - var layerError: UIColor = FXColors.Pink80 + var layerCritical: UIColor = FXColors.Pink80 var layerSelectedText: UIColor = FXColors.Blue40 var layerAutofillText: UIColor = FXColors.LightGrey05.withAlphaComponent(0.34) var layerSearch: UIColor = FXColors.DarkGrey80 @@ -77,10 +77,10 @@ private struct DarkColourPalette: ThemeColourPalette { var formKnob: UIColor = FXColors.White var indicatorActive: UIColor = FXColors.LightGrey90 var indicatorInactive: UIColor = FXColors.DarkGrey05 - var actionConfirmation: UIColor = FXColors.Green70 + var actionSuccess: UIColor = FXColors.Green70 var actionWarning: UIColor = FXColors.Yellow40.withAlphaComponent(0.41) - var actionError: UIColor = FXColors.Pink70.withAlphaComponent(0.69) - var actionInfo: UIColor = FXColors.Blue60 + var actionCritical: UIColor = FXColors.Pink70.withAlphaComponent(0.69) + var actionInformation: UIColor = FXColors.Blue60 var actionTabActive: UIColor = FXColors.DarkGrey30 var actionTabInactive: UIColor = FXColors.DarkGrey80 @@ -88,7 +88,7 @@ private struct DarkColourPalette: ThemeColourPalette { var textPrimary: UIColor = FXColors.LightGrey05 var textSecondary: UIColor = FXColors.LightGrey40 var textDisabled: UIColor = FXColors.LightGrey05.withAlphaComponent(0.4) - var textWarning: UIColor = FXColors.Red20 + var textCritical: UIColor = FXColors.Red20 var textAccent: UIColor = FXColors.Blue30 var textOnDark: UIColor = FXColors.LightGrey05 var textOnLight: UIColor = FXColors.DarkGrey90 @@ -99,9 +99,9 @@ private struct DarkColourPalette: ThemeColourPalette { var iconPrimary: UIColor = FXColors.LightGrey05 var iconSecondary: UIColor = FXColors.LightGrey40 var iconDisabled: UIColor = FXColors.LightGrey05.withAlphaComponent(0.4) - var iconAction: UIColor = FXColors.Blue30 + var iconAccent: UIColor = FXColors.Blue30 var iconOnColor: UIColor = FXColors.LightGrey05 - var iconWarning: UIColor = FXColors.Red20 + var iconCritical: UIColor = FXColors.Red20 var iconSpinner: UIColor = FXColors.White var iconAccentViolet: UIColor = FXColors.Violet20 var iconAccentBlue: UIColor = FXColors.Blue30 diff --git a/BrowserKit/Sources/Common/Theming/LightTheme.swift b/BrowserKit/Sources/Common/Theming/LightTheme.swift index 19556684c5eb..c357295b9407 100644 --- a/BrowserKit/Sources/Common/Theming/LightTheme.swift +++ b/BrowserKit/Sources/Common/Theming/LightTheme.swift @@ -32,10 +32,10 @@ private struct LightColourPalette: ThemeColourPalette { FXColors.LightGrey10.withAlphaComponent(1), FXColors.LightGrey10.withAlphaComponent(1) ]) - var layerInfo: UIColor = FXColors.Blue50.withAlphaComponent(0.44) - var layerConfirmation: UIColor = FXColors.Green20 + var layerInformation: UIColor = FXColors.Blue50.withAlphaComponent(0.44) + var layerSuccess: UIColor = FXColors.Green20 var layerWarning: UIColor = FXColors.Yellow20 - var layerError: UIColor = FXColors.Red10 + var layerCritical: UIColor = FXColors.Red10 var layerSelectedText: UIColor = FXColors.Blue50 var layerAutofillText: UIColor = FXColors.DarkGrey05.withAlphaComponent(0.73) var layerSearch: UIColor = FXColors.LightGrey30 @@ -66,10 +66,10 @@ private struct LightColourPalette: ThemeColourPalette { var formKnob: UIColor = FXColors.White var indicatorActive: UIColor = FXColors.LightGrey50 var indicatorInactive: UIColor = FXColors.LightGrey30 - var actionConfirmation: UIColor = FXColors.Green60 + var actionSuccess: UIColor = FXColors.Green60 var actionWarning: UIColor = FXColors.Yellow60.withAlphaComponent(0.4) - var actionError: UIColor = FXColors.Red30 - var actionInfo: UIColor = FXColors.Blue50 + var actionCritical: UIColor = FXColors.Red30 + var actionInformation: UIColor = FXColors.Blue50 var actionTabActive: UIColor = FXColors.White var actionTabInactive: UIColor = FXColors.LightGrey20 @@ -77,7 +77,7 @@ private struct LightColourPalette: ThemeColourPalette { var textPrimary: UIColor = FXColors.DarkGrey90 var textSecondary: UIColor = FXColors.DarkGrey05 var textDisabled: UIColor = FXColors.DarkGrey90.withAlphaComponent(0.4) - var textWarning: UIColor = FXColors.Red70 + var textCritical: UIColor = FXColors.Red70 var textAccent: UIColor = FXColors.Blue50 var textOnDark: UIColor = FXColors.LightGrey05 var textOnLight: UIColor = FXColors.DarkGrey90 @@ -88,9 +88,9 @@ private struct LightColourPalette: ThemeColourPalette { var iconPrimary: UIColor = FXColors.DarkGrey90 var iconSecondary: UIColor = FXColors.DarkGrey05 var iconDisabled: UIColor = FXColors.DarkGrey90.withAlphaComponent(0.4) - var iconAction: UIColor = FXColors.Blue50 + var iconAccent: UIColor = FXColors.Blue50 var iconOnColor: UIColor = FXColors.LightGrey05 - var iconWarning: UIColor = FXColors.Red70 + var iconCritical: UIColor = FXColors.Red70 var iconSpinner: UIColor = FXColors.LightGrey80 var iconAccentViolet: UIColor = FXColors.Violet60 var iconAccentBlue: UIColor = FXColors.Blue60 diff --git a/BrowserKit/Sources/Common/Theming/PrivateModeTheme.swift b/BrowserKit/Sources/Common/Theming/PrivateModeTheme.swift index fa5054ec2d8c..91c4fafcd48d 100644 --- a/BrowserKit/Sources/Common/Theming/PrivateModeTheme.swift +++ b/BrowserKit/Sources/Common/Theming/PrivateModeTheme.swift @@ -34,10 +34,10 @@ private struct PrivateModeColorPalette: ThemeColourPalette { FXColors.Violet80, FXColors.Purple70 ]) - var layerInfo: UIColor = FXColors.Blue50 - var layerConfirmation: UIColor = FXColors.Green80 + var layerInformation: UIColor = FXColors.Blue50 + var layerSuccess: UIColor = FXColors.Green80 var layerWarning: UIColor = FXColors.Yellow70.withAlphaComponent(0.77) - var layerError: UIColor = FXColors.Pink80 + var layerCritical: UIColor = FXColors.Pink80 var layerSelectedText: UIColor = FXColors.Blue40 var layerAutofillText: UIColor = FXColors.Violet60 var layerSearch: UIColor = FXColors.Ink90 @@ -68,10 +68,10 @@ private struct PrivateModeColorPalette: ThemeColourPalette { var formKnob: UIColor = FXColors.White var indicatorActive: UIColor = FXColors.LightGrey90 var indicatorInactive: UIColor = FXColors.DarkGrey05 - var actionConfirmation: UIColor = FXColors.Green70 + var actionSuccess: UIColor = FXColors.Green70 var actionWarning: UIColor = FXColors.Yellow40.withAlphaComponent(0.41) - var actionError: UIColor = FXColors.Pink70.withAlphaComponent(0.69) - var actionInfo: UIColor = FXColors.Blue60 + var actionCritical: UIColor = FXColors.Pink70.withAlphaComponent(0.69) + var actionInformation: UIColor = FXColors.Blue60 var actionTabActive: UIColor = FXColors.Purple60 var actionTabInactive: UIColor = FXColors.Ink90 @@ -79,7 +79,7 @@ private struct PrivateModeColorPalette: ThemeColourPalette { var textPrimary: UIColor = FXColors.LightGrey05 var textSecondary: UIColor = FXColors.LightGrey40 var textDisabled: UIColor = FXColors.LightGrey05.withAlphaComponent(0.4) - var textWarning: UIColor = FXColors.Red20 + var textCritical: UIColor = FXColors.Red20 var textAccent: UIColor = FXColors.Blue30 var textOnDark: UIColor = FXColors.LightGrey05 var textOnLight: UIColor = FXColors.DarkGrey90 @@ -90,9 +90,9 @@ private struct PrivateModeColorPalette: ThemeColourPalette { var iconPrimary: UIColor = FXColors.LightGrey05 var iconSecondary: UIColor = FXColors.LightGrey40 var iconDisabled: UIColor = FXColors.LightGrey05.withAlphaComponent(0.4) - var iconAction: UIColor = FXColors.Blue30 + var iconAccent: UIColor = FXColors.Blue30 var iconOnColor: UIColor = FXColors.LightGrey05 - var iconWarning: UIColor = FXColors.Red20 + var iconCritical: UIColor = FXColors.Red20 var iconSpinner: UIColor = FXColors.White var iconAccentViolet: UIColor = FXColors.Violet20 var iconAccentBlue: UIColor = FXColors.Blue30 diff --git a/BrowserKit/Sources/Common/Theming/ThemeColourPalette.swift b/BrowserKit/Sources/Common/Theming/ThemeColourPalette.swift index 1c4572168ac3..d2aa57b7184e 100644 --- a/BrowserKit/Sources/Common/Theming/ThemeColourPalette.swift +++ b/BrowserKit/Sources/Common/Theming/ThemeColourPalette.swift @@ -23,10 +23,10 @@ public protocol ThemeColourPalette { var layerAccentPrivateNonOpaque: UIColor { get } var layerSepia: UIColor { get } var layerHomepage: Gradient { get } - var layerInfo: UIColor { get } - var layerConfirmation: UIColor { get } + var layerInformation: UIColor { get } + var layerSuccess: UIColor { get } var layerWarning: UIColor { get } - var layerError: UIColor { get } + var layerCritical: UIColor { get } var layerSelectedText: UIColor { get } var layerAutofillText: UIColor { get } var layerSearch: UIColor { get } @@ -54,10 +54,10 @@ public protocol ThemeColourPalette { var formKnob: UIColor { get } var indicatorActive: UIColor { get } var indicatorInactive: UIColor { get } - var actionConfirmation: UIColor { get } + var actionSuccess: UIColor { get } var actionWarning: UIColor { get } - var actionError: UIColor { get } - var actionInfo: UIColor { get } + var actionCritical: UIColor { get } + var actionInformation: UIColor { get } var actionTabActive: UIColor { get } var actionTabInactive: UIColor { get } @@ -65,7 +65,7 @@ public protocol ThemeColourPalette { var textPrimary: UIColor { get } var textSecondary: UIColor { get } var textDisabled: UIColor { get } - var textWarning: UIColor { get } + var textCritical: UIColor { get } var textAccent: UIColor { get } var textOnDark: UIColor { get } var textOnLight: UIColor { get } @@ -76,9 +76,9 @@ public protocol ThemeColourPalette { var iconPrimary: UIColor { get } var iconSecondary: UIColor { get } var iconDisabled: UIColor { get } - var iconAction: UIColor { get } + var iconAccent: UIColor { get } var iconOnColor: UIColor { get } - var iconWarning: UIColor { get } + var iconCritical: UIColor { get } var iconSpinner: UIColor { get } var iconAccentViolet: UIColor { get } var iconAccentBlue: UIColor { get } diff --git a/BrowserKit/Sources/ComponentLibrary/Headers/HeaderView.swift b/BrowserKit/Sources/ComponentLibrary/Headers/HeaderView.swift index fd8fae37716d..4ad96f23751a 100644 --- a/BrowserKit/Sources/ComponentLibrary/Headers/HeaderView.swift +++ b/BrowserKit/Sources/ComponentLibrary/Headers/HeaderView.swift @@ -193,7 +193,7 @@ public final class HeaderView: UIView, ThemeApplicable { public func setupDetails(subtitle: String, title: String, icon: UIImage?, warningIcon: String?, theme: Theme) { titleLabel.text = title subtitleLabel.text = subtitle - subtitleLabel.textColor = theme.colors.textWarning + subtitleLabel.textColor = theme.colors.textCritical if let icon { favicon.manuallySetImage(icon) let isAccessibilityCategory = UIApplication.shared.preferredContentSizeCategory.isAccessibilityCategory @@ -201,7 +201,7 @@ public final class HeaderView: UIView, ThemeApplicable { favicon.layer.cornerRadius = 0.5 * maskButtonSizes } if let warningIcon { - warningIconView.tintColor = theme.colors.iconWarning + warningIconView.tintColor = theme.colors.iconCritical warningIconView.isHidden = false warningIconView.image = UIImage(named: warningIcon)?.withRenderingMode(.alwaysTemplate) } diff --git a/BrowserKit/Sources/ComponentLibrary/Headers/NavigationHeaderView.swift b/BrowserKit/Sources/ComponentLibrary/Headers/NavigationHeaderView.swift index 1207e0094311..906973f0a7e1 100644 --- a/BrowserKit/Sources/ComponentLibrary/Headers/NavigationHeaderView.swift +++ b/BrowserKit/Sources/ComponentLibrary/Headers/NavigationHeaderView.swift @@ -141,7 +141,7 @@ public final class NavigationHeaderView: UIView { .withTintColor(theme.colors.iconSecondary) closeButton.setImage(buttonImage, for: .normal) closeButton.backgroundColor = theme.colors.layer2 - backButton.tintColor = theme.colors.iconAction + backButton.tintColor = theme.colors.iconAccent backButton.setTitleColor(theme.colors.textAccent, for: .normal) horizontalLine.backgroundColor = theme.colors.borderPrimary titleLabel.textColor = theme.colors.textPrimary diff --git a/BrowserKit/Sources/ToolbarKit/AddressToolbar/AddressToolbar.swift b/BrowserKit/Sources/ToolbarKit/AddressToolbar/AddressToolbar.swift index 402c0000f270..980d2a9c8d31 100644 --- a/BrowserKit/Sources/ToolbarKit/AddressToolbar/AddressToolbar.swift +++ b/BrowserKit/Sources/ToolbarKit/AddressToolbar/AddressToolbar.swift @@ -8,8 +8,8 @@ import Foundation public protocol AddressToolbar { func configure(state: AddressToolbarState, toolbarDelegate: AddressToolbarDelegate, - leadingSpace: CGFloat?, - trailingSpace: CGFloat?, + leadingSpace: CGFloat, + trailingSpace: CGFloat, isUnifiedSearchEnabled: Bool) func setAutocompleteSuggestion(_ suggestion: String?) diff --git a/BrowserKit/Sources/ToolbarKit/AddressToolbar/BrowserAddressToolbar.swift b/BrowserKit/Sources/ToolbarKit/AddressToolbar/BrowserAddressToolbar.swift index 70c237e711d4..8d57da7c0cca 100644 --- a/BrowserKit/Sources/ToolbarKit/AddressToolbar/BrowserAddressToolbar.swift +++ b/BrowserKit/Sources/ToolbarKit/AddressToolbar/BrowserAddressToolbar.swift @@ -76,8 +76,8 @@ public class BrowserAddressToolbar: UIView, public func configure(state: AddressToolbarState, toolbarDelegate: any AddressToolbarDelegate, - leadingSpace: CGFloat? = nil, - trailingSpace: CGFloat? = nil, + leadingSpace: CGFloat, + trailingSpace: CGFloat, isUnifiedSearchEnabled: Bool) { self.toolbarDelegate = toolbarDelegate configure(state: state, isUnifiedSearchEnabled: isUnifiedSearchEnabled) @@ -142,25 +142,23 @@ public class BrowserAddressToolbar: UIView, toolbarBottomBorderHeightConstraint?.isActive = true leadingNavigationActionStackConstraint = navigationActionStack.leadingAnchor.constraint( - equalTo: toolbarContainerView.leadingAnchor, - constant: UX.horizontalEdgeSpace) + equalTo: toolbarContainerView.leadingAnchor) leadingNavigationActionStackConstraint?.isActive = true trailingBrowserActionStackConstraint = browserActionStack.trailingAnchor.constraint( - equalTo: toolbarContainerView.trailingAnchor, - constant: -UX.horizontalEdgeSpace) + equalTo: toolbarContainerView.trailingAnchor) trailingBrowserActionStackConstraint?.isActive = true locationContainerHeightConstraint = locationContainer.heightAnchor.constraint(equalToConstant: UX.locationHeight) locationContainerHeightConstraint?.isActive = true NSLayoutConstraint.activate([ - toolbarContainerView.leadingAnchor.constraint(equalTo: leadingAnchor), + toolbarContainerView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor), toolbarContainerView.topAnchor.constraint(equalTo: toolbarTopBorderView.topAnchor, constant: UX.verticalEdgeSpace), toolbarContainerView.bottomAnchor.constraint(equalTo: toolbarBottomBorderView.bottomAnchor, constant: -UX.verticalEdgeSpace), - toolbarContainerView.trailingAnchor.constraint(equalTo: trailingAnchor), + toolbarContainerView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor), toolbarTopBorderView.leadingAnchor.constraint(equalTo: leadingAnchor), toolbarTopBorderView.topAnchor.constraint(equalTo: topAnchor), @@ -236,9 +234,9 @@ public class BrowserAddressToolbar: UIView, updateActionSpacing() } - private func updateSpacing(leading: CGFloat?, trailing: CGFloat?) { - leadingNavigationActionStackConstraint?.constant = leading ?? UX.horizontalEdgeSpace - trailingBrowserActionStackConstraint?.constant = trailing ?? -UX.horizontalEdgeSpace + private func updateSpacing(leading: CGFloat, trailing: CGFloat) { + leadingNavigationActionStackConstraint?.constant = leading + trailingBrowserActionStackConstraint?.constant = -trailing } private func setZeroWidthConstraint(_ stackView: UIStackView) { diff --git a/BrowserKit/Sources/ToolbarKit/AddressToolbar/LocationView/LocationView.swift b/BrowserKit/Sources/ToolbarKit/AddressToolbar/LocationView/LocationView.swift index bfb7c8809ff8..ef24a2db13ec 100644 --- a/BrowserKit/Sources/ToolbarKit/AddressToolbar/LocationView/LocationView.swift +++ b/BrowserKit/Sources/ToolbarKit/AddressToolbar/LocationView/LocationView.swift @@ -5,7 +5,11 @@ import UIKit import Common -final class LocationView: UIView, LocationTextFieldDelegate, ThemeApplicable, AccessibilityActionsSource { +final class LocationView: UIView, + LocationTextFieldDelegate, + ThemeApplicable, + AccessibilityActionsSource, + MenuHelperURLBarInterface { // MARK: - Properties private enum UX { static let horizontalSpace: CGFloat = 8 @@ -363,6 +367,21 @@ final class LocationView: UIView, LocationTextFieldDelegate, ThemeApplicable, Ac } } + // MARK: - MenuHelperURLBarInterface + override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { + if action == MenuHelperURLBarModel.selectorPasteAndGo { + return UIPasteboard.general.hasStrings + } + + return super.canPerformAction(action, withSender: sender) + } + + func menuHelperPasteAndGo() { + guard let pasteboardContents = UIPasteboard.general.string else { return } + delegate?.locationViewDidSubmitText(pasteboardContents) + urlTextField.text = pasteboardContents + } + // MARK: - LocationTextFieldDelegate func locationTextField(_ textField: LocationTextField, didEnterText text: String) { delegate?.locationViewDidEnterText(text) diff --git a/BrowserKit/Sources/ToolbarKit/ToolbarButton.swift b/BrowserKit/Sources/ToolbarKit/ToolbarButton.swift index aee7a5385332..694ff19a2a44 100644 --- a/BrowserKit/Sources/ToolbarKit/ToolbarButton.swift +++ b/BrowserKit/Sources/ToolbarKit/ToolbarButton.swift @@ -175,7 +175,7 @@ class ToolbarButton: UIButton, ThemeApplicable { badgeImageView?.layer.borderColor = colors.layer1.cgColor badgeImageView?.backgroundColor = maskImageView == nil ? colors.layer1 : .clear - badgeImageView?.tintColor = maskImageView == nil ? .clear : colors.actionInfo + badgeImageView?.tintColor = maskImageView == nil ? .clear : colors.actionInformation maskImageView?.tintColor = colors.layer1 setNeedsUpdateConfiguration() diff --git a/firefox-ios/Client.xcodeproj/project.pbxproj b/firefox-ios/Client.xcodeproj/project.pbxproj index e34906fd90bc..79b9243ef325 100644 --- a/firefox-ios/Client.xcodeproj/project.pbxproj +++ b/firefox-ios/Client.xcodeproj/project.pbxproj @@ -290,7 +290,7 @@ 2F44FCC51A9E85E900FD20CC /* SettingsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F44FCC41A9E85E900FD20CC /* SettingsTableViewController.swift */; }; 2F44FCC71A9E8CF500FD20CC /* SearchSettingsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F44FCC61A9E8CF500FD20CC /* SearchSettingsTableViewController.swift */; }; 2F44FCCB1A9E972E00FD20CC /* SearchEnginePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F44FCCA1A9E972E00FD20CC /* SearchEnginePicker.swift */; }; - 2F697F7E1A9FD22D009E03AE /* SearchEnginesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F697F7D1A9FD22D009E03AE /* SearchEnginesTests.swift */; }; + 2F697F7E1A9FD22D009E03AE /* SearchEnginesManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F697F7D1A9FD22D009E03AE /* SearchEnginesManagerTests.swift */; }; 2FCAE25F1ABB531100877008 /* Cursor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FCAE2411ABB531100877008 /* Cursor.swift */; }; 2FCAE2611ABB531100877008 /* FileAccessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FCAE2431ABB531100877008 /* FileAccessor.swift */; }; 2FCAE2651ABB531100877008 /* RemoteTabs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FCAE2471ABB531100877008 /* RemoteTabs.swift */; }; @@ -390,6 +390,8 @@ 435D660523D794B90046EFA2 /* UpdateViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435D660423D794B90046EFA2 /* UpdateViewModel.swift */; }; 435D7CC5246209AA0043ACB9 /* IntroViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435D7CC4246209AA0043ACB9 /* IntroViewController.swift */; }; 435E34B3254A6A6000406D92 /* TimeConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = E650758F1E37F7AB006961AC /* TimeConstants.swift */; }; + 436033C62CCFA811000BBEA2 /* FxANotification.strings in Resources */ = {isa = PBXBuildFile; fileRef = 436033C42CCFA811000BBEA2 /* FxANotification.strings */; }; + 436033C92CCFA811000BBEA2 /* SearchEngineSelection.strings in Resources */ = {isa = PBXBuildFile; fileRef = 436033C72CCFA811000BBEA2 /* SearchEngineSelection.strings */; }; 4369B8812B0B75A8003791B9 /* FirefoxHomepage.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4369B87F2B0B75A8003791B9 /* FirefoxHomepage.strings */; }; 436E0E152BA857AB00D01C1A /* BottomSheet.strings in Resources */ = {isa = PBXBuildFile; fileRef = 436E0E132BA857AB00D01C1A /* BottomSheet.strings */; }; 43737CB329E4259700847A6F /* Edit Card.strings in Resources */ = {isa = PBXBuildFile; fileRef = 43737CB129E4259700847A6F /* Edit Card.strings */; }; @@ -1444,7 +1446,6 @@ D0FCF8081FE4772D004A7995 /* MainFrameAtDocumentStart.js in Resources */ = {isa = PBXBuildFile; fileRef = D0FCF8051FE4772D004A7995 /* MainFrameAtDocumentStart.js */; }; D301AAEE1A3A55B70078DD1D /* LegacyGridTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D301AAED1A3A55B70078DD1D /* LegacyGridTabViewController.swift */; }; D30684F11C84F12A002D8D82 /* SearchPlugins in Resources */ = {isa = PBXBuildFile; fileRef = D30684F01C84F12A002D8D82 /* SearchPlugins */; }; - D308E4E41A5306F500842685 /* SearchEngines.swift in Sources */ = {isa = PBXBuildFile; fileRef = D308E4E31A5306F500842685 /* SearchEngines.swift */; }; D308EE561CBF0BF5006843F2 /* CertError.css in Resources */ = {isa = PBXBuildFile; fileRef = D308EE551CBF0BF5006843F2 /* CertError.css */; }; D313BE981B2F5096009EF241 /* DomainAutocompleteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D313BE971B2F5096009EF241 /* DomainAutocompleteTests.swift */; }; D314E7F71A37B98700426A76 /* TabToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = D314E7F51A37B98700426A76 /* TabToolbar.swift */; }; @@ -1466,7 +1467,6 @@ D37DE2CB1CA356F900A5EC69 /* testcert2.pem in Resources */ = {isa = PBXBuildFile; fileRef = D37DE2C91CA356F900A5EC69 /* testcert2.pem */; }; D38A1BEE1A9FA2CA00F6A386 /* SiteTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D38A1BEC1A9FA2CA00F6A386 /* SiteTableViewController.swift */; }; D38A1EE01CB458EC0080C842 /* CertError.html in Resources */ = {isa = PBXBuildFile; fileRef = D38A1EDF1CB458EC0080C842 /* CertError.html */; }; - D38B2D8A1A8D98D00040E6B5 /* SearchEngines.swift in Sources */ = {isa = PBXBuildFile; fileRef = D308E4E31A5306F500842685 /* SearchEngines.swift */; }; D38B2D8C1A8D98D90040E6B5 /* OpenSearchParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3FA77831A43B2CE0010CD32 /* OpenSearchParser.swift */; }; D38F02D11C05127100175932 /* Authenticator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D38F02D01C05127100175932 /* Authenticator.swift */; }; D38F03701C06387900175932 /* AuthenticationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D38F036F1C06387900175932 /* AuthenticationTests.swift */; }; @@ -1832,11 +1832,19 @@ EBE26B57220C959D00D1D99A /* BrowserViewController+TabToolbarDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE26B4E220C959D00D1D99A /* BrowserViewController+TabToolbarDelegate.swift */; }; EBF47E701F7979DF00899189 /* TelemetryWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBF47E6F1F7979DF00899189 /* TelemetryWrapper.swift */; }; EBFDB790211C83A5005CCA2F /* BrowserViewController+FindInPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBFDB787211C83A5005CCA2F /* BrowserViewController+FindInPage.swift */; }; + ED07C0E62CCACD7E006C0627 /* Locale+possibilitiesForLanguageIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED07C0E52CCACD7E006C0627 /* Locale+possibilitiesForLanguageIdentifier.swift */; }; + ED07C0E72CCACE18006C0627 /* Locale+possibilitiesForLanguageIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED07C0E52CCACD7E006C0627 /* Locale+possibilitiesForLanguageIdentifier.swift */; }; + ED07C0EB2CCADCD5006C0627 /* SearchEngineSelectionState.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED07C0E92CCADCD5006C0627 /* SearchEngineSelectionState.swift */; }; + ED07C0ED2CCAE745006C0627 /* SearchEngineSelectionAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED07C0EC2CCAE745006C0627 /* SearchEngineSelectionAction.swift */; }; + ED07C0EF2CCAE856006C0627 /* SearchEngineSelectionMiddleware.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED07C0EE2CCAE856006C0627 /* SearchEngineSelectionMiddleware.swift */; }; + ED07C0F22CCAFED1006C0627 /* SearchEngineSelectionStateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED07C0F02CCAFEC2006C0627 /* SearchEngineSelectionStateTests.swift */; }; + ED07C0F52CCB020B006C0627 /* SearchEngineSelectionMiddlewareTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED07C0F32CCB0200006C0627 /* SearchEngineSelectionMiddlewareTests.swift */; }; ED28DAC92C45A95F00D2641C /* TabScrollBehaviorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED28DAC82C45A95F00D2641C /* TabScrollBehaviorModel.swift */; }; ED371A682CB881EF0099F3C8 /* SearchEngineSelectionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED371A672CB881EF0099F3C8 /* SearchEngineSelectionCoordinator.swift */; }; ED45893E2CC800D9006F2C0B /* SearchEngineSelectionViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED45893D2CC800D9006F2C0B /* SearchEngineSelectionViewControllerTests.swift */; }; ED4589402CC8220A006F2C0B /* MockSearchEngineSelectionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED45893F2CC8220A006F2C0B /* MockSearchEngineSelectionCoordinator.swift */; }; ED55DC8C2CC2D7DA00E3FE3A /* SearchEngineSelectionCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED55DC8B2CC2D7DA00E3FE3A /* SearchEngineSelectionCoordinatorTests.swift */; }; + EDC3C2562CCAC9CB005A047F /* SearchEnginesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDC3C2552CCAC9CB005A047F /* SearchEnginesManager.swift */; }; EDC3D34F2CB5E70500C62DE3 /* SearchEngineTestAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EDC3D34E2CB5E70500C62DE3 /* SearchEngineTestAssets.xcassets */; }; EDC3D3552CB70A3F00C62DE3 /* OpenSearchEngineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDC3D3542CB70A3F00C62DE3 /* OpenSearchEngineTests.swift */; }; EDD21F2E2CAEFB8F00AF7D1F /* SearchEngineSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDD21F2D2CAEFB8F00AF7D1F /* SearchEngineSelectionViewController.swift */; }; @@ -2771,7 +2779,7 @@ 2F44FCC41A9E85E900FD20CC /* SettingsTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsTableViewController.swift; sourceTree = ""; }; 2F44FCC61A9E8CF500FD20CC /* SearchSettingsTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchSettingsTableViewController.swift; sourceTree = ""; }; 2F44FCCA1A9E972E00FD20CC /* SearchEnginePicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchEnginePicker.swift; sourceTree = ""; }; - 2F697F7D1A9FD22D009E03AE /* SearchEnginesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchEnginesTests.swift; sourceTree = ""; }; + 2F697F7D1A9FD22D009E03AE /* SearchEnginesManagerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchEnginesManagerTests.swift; sourceTree = ""; }; 2F7A4680A2BCE93CE0BD8392 /* ml */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ml; path = ml.lproj/Menu.strings; sourceTree = ""; }; 2F884BA290D689F05C289FDE /* pa-IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pa-IN"; path = "pa-IN.lproj/Shared.strings"; sourceTree = ""; }; 2FA435FB1ABB83B4008031D1 /* libAccount.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAccount.a; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -3040,6 +3048,8 @@ 430170CD28B903CA007A163A /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/ToolbarLocation.strings"; sourceTree = ""; }; 430170CE28B903CA007A163A /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/Localizable.strings"; sourceTree = ""; }; 430173AD2BE8F1BE003B90CB /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Microsurvey.strings; sourceTree = ""; }; + 430175A12CCFAC8F000DFF93 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/FxANotification.strings; sourceTree = ""; }; + 430175A22CCFAC8F000DFF93 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 4301826F2A5C20130064C5AE /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/CustomizeFirefoxHome.strings; sourceTree = ""; }; 430182702A5C20130064C5AE /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/SelectCreditCard.strings; sourceTree = ""; }; 4301946A2BB1927600D1303E /* bs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bs; path = bs.lproj/BottomSheet.strings; sourceTree = ""; }; @@ -3171,6 +3181,7 @@ 430B8F7B2AC1A2B500CDB6CC /* ia */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ia; path = ia.lproj/TabLocation.strings; sourceTree = ""; }; 430B9F052A24C0E200DC4B8E /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/DisplayCard.strings; sourceTree = ""; }; 430BCF642CA1855900A2B7B8 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/PasswordGenerator.strings; sourceTree = ""; }; + 430BD28E2CCFAAF5006DD679 /* lo */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lo; path = lo.lproj/MainMenu.strings; sourceTree = ""; }; 430BF5892B023C5E002706CF /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/Shopping.strings; sourceTree = ""; }; 430CBA2C2BB1948500532275 /* hy-AM */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hy-AM"; path = "hy-AM.lproj/BottomSheet.strings"; sourceTree = ""; }; 430CBB9C2C85D77A00303860 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Bookmarks.strings; sourceTree = ""; }; @@ -3207,6 +3218,10 @@ 430EE26429BA6968009B5023 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/EngagementNotification.strings"; sourceTree = ""; }; 430EE26529BA6968009B5023 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/Onboarding.strings"; sourceTree = ""; }; 430EE26629BA6968009B5023 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/ResearchSurface.strings"; sourceTree = ""; }; + 430F21512CCFAA0D00576881 /* hy-AM */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hy-AM"; path = "hy-AM.lproj/FxANotification.strings"; sourceTree = ""; }; + 430F21522CCFAA0D00576881 /* hy-AM */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hy-AM"; path = "hy-AM.lproj/SearchEngineSelection.strings"; sourceTree = ""; }; + 430F22A52CCFA8D000256A3B /* es-AR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-AR"; path = "es-AR.lproj/FxANotification.strings"; sourceTree = ""; }; + 430F22A62CCFA8D000256A3B /* es-AR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-AR"; path = "es-AR.lproj/SearchEngineSelection.strings"; sourceTree = ""; }; 430F432F2AEFC76F0025E670 /* hy-AM */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hy-AM"; path = "hy-AM.lproj/Shopping.strings"; sourceTree = ""; }; 430F44532B3061AF0088F004 /* pa-IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pa-IN"; path = "pa-IN.lproj/ContextualHints.strings"; sourceTree = ""; }; 430F44542B3061AF0088F004 /* pa-IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pa-IN"; path = "pa-IN.lproj/CredentialProvider.strings"; sourceTree = ""; }; @@ -3308,6 +3323,8 @@ 4315ABB32B0B763100838EF4 /* es-AR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-AR"; path = "es-AR.lproj/FirefoxHomepage.strings"; sourceTree = ""; }; 4315C1E528EAF9C300BA61F5 /* be */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = be; path = be.lproj/Shared.strings; sourceTree = ""; }; 4315C1E628EAF9C300BA61F5 /* be */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = be; path = be.lproj/ToolbarLocation.strings; sourceTree = ""; }; + 4315E7522CCFA92D003BEB39 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/FxANotification.strings; sourceTree = ""; }; + 4315E7532CCFA92D003BEB39 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 4315F5832A1B87DE00D6BA24 /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/FirefoxSync.strings; sourceTree = ""; }; 43162A2E2492DB7800F91658 /* EmptyPrivateTabsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyPrivateTabsView.swift; sourceTree = ""; }; 43163F792C85D87C004A2774 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Bookmarks.strings; sourceTree = ""; }; @@ -3347,6 +3364,8 @@ 431813AE2C57B017007C3268 /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/Toolbar.strings"; sourceTree = ""; }; 43183D2F293E0C44009F788D /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Alerts.strings"; sourceTree = ""; }; 43183D30293E0C44009F788D /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/TabsTray.strings"; sourceTree = ""; }; + 431851832CCFA868008A5045 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/FxANotification.strings; sourceTree = ""; }; + 431851842CCFA868008A5045 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 431853AA2A0911440099B0E0 /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = "gl.lproj/Default Browser.strings"; sourceTree = ""; }; 431853AB2A0911440099B0E0 /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/Today.strings; sourceTree = ""; }; 431853AC2A0911440099B0E0 /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/BookmarkPanelDeleteConfirm.strings; sourceTree = ""; }; @@ -3408,6 +3427,8 @@ 431CF720293E0D1800F301ED /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Alerts.strings; sourceTree = ""; }; 431CF721293E0D1800F301ED /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/TabsTray.strings; sourceTree = ""; }; 431CFA4328B39F0200093D6D /* ses */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ses; path = ses.lproj/BookmarkPanel.strings; sourceTree = ""; }; + 431D2B922CCFAA1E002D802C /* ia */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ia; path = ia.lproj/FxANotification.strings; sourceTree = ""; }; + 431D2B932CCFAA1E002D802C /* ia */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ia; path = ia.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 431D38812A49AADF00A8BE49 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Footer.strings; sourceTree = ""; }; 431D38822A49AADF00A8BE49 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/RememberCard.strings; sourceTree = ""; }; 431D38832A49AADF00A8BE49 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/UpdateCard.strings; sourceTree = ""; }; @@ -3525,6 +3546,8 @@ 4327926B2BB192FD001707B5 /* en-CA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-CA"; path = "en-CA.lproj/LoginsHelper.strings"; sourceTree = ""; }; 4327926C2BB192FD001707B5 /* en-CA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-CA"; path = "en-CA.lproj/PasswordAutofill.strings"; sourceTree = ""; }; 4327B80D2CA184FC00D1B054 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PasswordGenerator.strings; sourceTree = ""; }; + 4327C7D52CCFACA100E79AF8 /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/FxANotification.strings; sourceTree = ""; }; + 4327C7D62CCFACA100E79AF8 /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 4327FA2029C8772000C0E230 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/Alert.strings"; sourceTree = ""; }; 4327FA2129C8772000C0E230 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/BiometricAuthentication.strings"; sourceTree = ""; }; 4327FA2229C8772000C0E230 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/EditCard.strings"; sourceTree = ""; }; @@ -3727,6 +3750,7 @@ 4337C9D62A5C211300987DEB /* tt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tt; path = tt.lproj/SelectCreditCard.strings; sourceTree = ""; }; 4337C9D72A5C211300987DEB /* tt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tt; path = tt.lproj/UpdateCard.strings; sourceTree = ""; }; 4337E1142AEFC993007579AC /* zh-CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-CN"; path = "zh-CN.lproj/Shopping.strings"; sourceTree = ""; }; + 4337EC742CCFA950002FAA92 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 433801E62CA186030025B82A /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/PasswordGenerator.strings; sourceTree = ""; }; 43383DE92C57AF94001BCD0E /* co */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = co; path = co.lproj/EditAddress.strings; sourceTree = ""; }; 43383DEA2C57AF94001BCD0E /* co */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = co; path = co.lproj/ScanQRCode.strings; sourceTree = ""; }; @@ -3796,6 +3820,8 @@ 433D53CB2B0B798700F5786C /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/FirefoxHomepage.strings; sourceTree = ""; }; 433D64C62C60EE1100CEC389 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/ScanQRCode.strings; sourceTree = ""; }; 433D64C72C60EE1100CEC389 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Toolbar.strings; sourceTree = ""; }; + 433D70502CCFA8E2008704C8 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/FxANotification.strings"; sourceTree = ""; }; + 433D70512CCFA8E2008704C8 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/SearchEngineSelection.strings"; sourceTree = ""; }; 433DD5FB2AEFC6EB00C80D13 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/Shopping.strings; sourceTree = ""; }; 433E0DEC26FCE37C00B78CC5 /* ne-NP */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ne-NP"; path = "ne-NP.lproj/Default Browser.strings"; sourceTree = ""; }; 433E11402A124A2C00B4C650 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/FirefoxSync.strings; sourceTree = ""; }; @@ -3866,6 +3892,8 @@ 4344A4EE2A124A150024B813 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/ZoomPageBar.strings; sourceTree = ""; }; 4344BD7C2AEFC6490057F642 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Shopping.strings; sourceTree = ""; }; 4344D02F292259CE00B12BF8 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/SearchHeaderTitle.strings"; sourceTree = ""; }; + 434500692CCFABA000C4DC75 /* nn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nn; path = nn.lproj/FxANotification.strings; sourceTree = ""; }; + 4345006A2CCFABA000C4DC75 /* nn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nn; path = nn.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 4345055729E4289200F137B6 /* sat-Olck */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sat-Olck"; path = "sat-Olck.lproj/Settings.strings"; sourceTree = ""; }; 4345441C26D2E52600D5EEAA /* SearchTermGroupsUtility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchTermGroupsUtility.swift; sourceTree = ""; }; 4345B7712CBD339D00A50A82 /* bs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bs; path = bs.lproj/PasswordGenerator.strings; sourceTree = ""; }; @@ -3886,6 +3914,8 @@ 43470F4C2C3C0064001D89BE /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/EditAddress.strings"; sourceTree = ""; }; 43470F4D2C3C0064001D89BE /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/ScanQRCode.strings"; sourceTree = ""; }; 4347183C2AEFC8380017195A /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Shopping.strings; sourceTree = ""; }; + 434720C72CCFAD8E007554E9 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/FxANotification.strings; sourceTree = ""; }; + 434720C82CCFAD8E007554E9 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 434735AE29EF065700D7FFE2 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = "es.lproj/Edit Card.strings"; sourceTree = ""; }; 4347544E29C87819000D9710 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Alert.strings; sourceTree = ""; }; 4347544F29C87819000D9710 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/BiometricAuthentication.strings; sourceTree = ""; }; @@ -3930,6 +3960,8 @@ 434B69BA2B399D9200D77EA7 /* zh-CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-CN"; path = "zh-CN.lproj/Credentials.strings"; sourceTree = ""; }; 434B69BB2B399D9200D77EA7 /* zh-CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-CN"; path = "zh-CN.lproj/FirefoxLogins.strings"; sourceTree = ""; }; 434B69BC2B399D9200D77EA7 /* zh-CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-CN"; path = "zh-CN.lproj/LoginsHelper.strings"; sourceTree = ""; }; + 434B6DD52CCFA8F400272920 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/FxANotification.strings; sourceTree = ""; }; + 434B6DD62CCFA8F400272920 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 434B8D692B0B771500DC38A7 /* ia */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ia; path = ia.lproj/FirefoxHomepage.strings; sourceTree = ""; }; 434C3D1F2B8391F600A0FB8B /* kab */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kab; path = kab.lproj/PasswordAutofill.strings; sourceTree = ""; }; 434C573A2A52E55D00D296B8 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/CustomizeFirefoxHome.strings; sourceTree = ""; }; @@ -4107,6 +4139,8 @@ 435C0DF32B554BD9002F55FA /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/TabToolbar.strings; sourceTree = ""; }; 435C6C942C3C02EA00E45F09 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/EditAddress.strings; sourceTree = ""; }; 435C6C952C3C02EA00E45F09 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/ScanQRCode.strings; sourceTree = ""; }; + 435C718B2CCFA9B700B9D395 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/FxANotification.strings; sourceTree = ""; }; + 435C718C2CCFA9B700B9D395 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 435CC46729F69B3300CC7D73 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Notification.strings; sourceTree = ""; }; 435CC46829F69B3300CC7D73 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ZoomPageBar.strings; sourceTree = ""; }; 435D18132C85D4DC005F72B1 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/AddressToolbar.strings"; sourceTree = ""; }; @@ -4126,6 +4160,8 @@ 435D6F3D2C85D46400D496EB /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/MainMenu.strings"; sourceTree = ""; }; 435D6F3E2C85D46400D496EB /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/SuggestedSites.strings"; sourceTree = ""; }; 435D7CC4246209AA0043ACB9 /* IntroViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroViewController.swift; sourceTree = ""; }; + 435D89402CCFAD290034F043 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/FxANotification.strings; sourceTree = ""; }; + 435D89412CCFAD290034F043 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 435D89B72AC1A1A7005E0AD4 /* en-CA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-CA"; path = "en-CA.lproj/CustomizeFirefoxHome.strings"; sourceTree = ""; }; 435D89B82AC1A1A7005E0AD4 /* en-CA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-CA"; path = "en-CA.lproj/Notification.strings"; sourceTree = ""; }; 435D89B92AC1A1A7005E0AD4 /* en-CA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-CA"; path = "en-CA.lproj/RememberCard.strings"; sourceTree = ""; }; @@ -4172,6 +4208,8 @@ 435FEE3B2BDFBB3200AB9611 /* tt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tt; path = tt.lproj/ContextualHints.strings; sourceTree = ""; }; 435FEE3C2BDFBB3200AB9611 /* tt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tt; path = tt.lproj/Credentials.strings; sourceTree = ""; }; 43600BBC2AC1A4C0000B8B83 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/TabLocation.strings; sourceTree = ""; }; + 436033C52CCFA811000BBEA2 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/FxANotification.strings; sourceTree = ""; }; + 436033C82CCFA811000BBEA2 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 436038182CA1872C00A000E0 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/PasswordGenerator.strings; sourceTree = ""; }; 4360728429E42822000373A6 /* nn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nn; path = "nn.lproj/Edit Card.strings"; sourceTree = ""; }; 436075182AF902C40035F47A /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Shopping.strings; sourceTree = ""; }; @@ -4273,6 +4311,8 @@ 4366FF302C8F12F8002EB790 /* pa-IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pa-IN"; path = "pa-IN.lproj/MainMenu.strings"; sourceTree = ""; }; 4366FF312C8F12F8002EB790 /* pa-IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pa-IN"; path = "pa-IN.lproj/SuggestedSites.strings"; sourceTree = ""; }; 436705DA2C57B3D7002C7FE6 /* rm */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = rm; path = rm.lproj/Toolbar.strings; sourceTree = ""; }; + 436742352CCFADB00033AA35 /* zh-CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-CN"; path = "zh-CN.lproj/FxANotification.strings"; sourceTree = ""; }; + 436742362CCFADB00033AA35 /* zh-CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-CN"; path = "zh-CN.lproj/SearchEngineSelection.strings"; sourceTree = ""; }; 43674A2C2CA184750066F140 /* es-AR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-AR"; path = "es-AR.lproj/PasswordGenerator.strings"; sourceTree = ""; }; 43680DD7293E0A160013269F /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/Alerts.strings; sourceTree = ""; }; 43680DD8293E0A160013269F /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/TabsTray.strings; sourceTree = ""; }; @@ -4402,6 +4442,8 @@ 43711C672B83905C006DC502 /* dsb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = dsb; path = dsb.lproj/KeyboardAccessory.strings; sourceTree = ""; }; 43711C682B83905C006DC502 /* dsb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = dsb; path = dsb.lproj/PasswordAutofill.strings; sourceTree = ""; }; 437137DB2BE8F23800A3F62D /* eo */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eo; path = eo.lproj/Microsurvey.strings; sourceTree = ""; }; + 4371D0022CCFA8220002360A /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/FxANotification.strings; sourceTree = ""; }; + 4371D0032CCFA8230002360A /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 4371DF3A2CA1858D00B3688C /* hsb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hsb; path = hsb.lproj/PasswordGenerator.strings; sourceTree = ""; }; 4371EAA02B55499C00DD3D3C /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/TabToolbar.strings"; sourceTree = ""; }; 437227122BA8575600147F81 /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = "bg.lproj/Default Browser.strings"; sourceTree = ""; }; @@ -4461,6 +4503,8 @@ 437579372B0B773B005F2178 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/FirefoxHomepage.strings; sourceTree = ""; }; 437582642BE8F37A006F43C6 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Microsurvey.strings; sourceTree = ""; }; 43758DC32B0B78E300DA928C /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/FirefoxHomepage.strings; sourceTree = ""; }; + 4375B35D2CCFADC1000DB6C1 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-TW"; path = "zh-TW.lproj/FxANotification.strings"; sourceTree = ""; }; + 4375B35E2CCFADC1000DB6C1 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-TW"; path = "zh-TW.lproj/SearchEngineSelection.strings"; sourceTree = ""; }; 4375C3222A24BF03004E1E5A /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/DisplayCard.strings"; sourceTree = ""; }; 4375F0E12C453BC4001F3A55 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ActivityStream.strings; sourceTree = ""; }; 4375F0E22C453BC4001F3A55 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/AddressToolbar.strings; sourceTree = ""; }; @@ -4677,6 +4721,8 @@ 4384E08D2C85D58F0000C502 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Bookmarks.strings; sourceTree = ""; }; 4384E08E2C85D58F0000C502 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/MainMenu.strings; sourceTree = ""; }; 4384E08F2C85D58F0000C502 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/SuggestedSites.strings; sourceTree = ""; }; + 438502862CCFA88A00172282 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/FxANotification.strings"; sourceTree = ""; }; + 438502872CCFA88B00172282 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/SearchEngineSelection.strings"; sourceTree = ""; }; 43850DA529D1B2F900927110 /* oc */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = oc; path = "oc.lproj/Default Browser.strings"; sourceTree = ""; }; 438532AE2A2DF9CE001C2849 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Footer.strings; sourceTree = ""; }; 438532AF2A2DF9CE001C2849 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/RememberCard.strings; sourceTree = ""; }; @@ -4791,6 +4837,8 @@ 438DF00C2959B85B005E4C8F /* en-CA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-CA"; path = "en-CA.lproj/TabsTray.strings"; sourceTree = ""; }; 438E69C22BA85A1200DE4241 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/BottomSheet.strings; sourceTree = ""; }; 438E812A2C57B30F004E1492 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/EditAddress.strings; sourceTree = ""; }; + 438E87B12CCFA9EB00A2538C /* hsb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hsb; path = hsb.lproj/FxANotification.strings; sourceTree = ""; }; + 438E87B22CCFA9EB00A2538C /* hsb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hsb; path = hsb.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 438EA1322C298BCA00EF793D /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/ActivityStream.strings; sourceTree = ""; }; 438EA1332C298BCA00EF793D /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/AddressToolbar.strings; sourceTree = ""; }; 438EA1342C298BCA00EF793D /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/EnhancedTrackingProtection.strings; sourceTree = ""; }; @@ -4919,6 +4967,8 @@ 4397E7BA2C85D47700F5D6F4 /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/MainMenu.strings"; sourceTree = ""; }; 4397E7BB2C85D47700F5D6F4 /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/SuggestedSites.strings"; sourceTree = ""; }; 4397EB162AC1A2A900EB6952 /* hy-AM */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hy-AM"; path = "hy-AM.lproj/TabLocation.strings"; sourceTree = ""; }; + 439844182CCFAA410056D868 /* is */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = is; path = is.lproj/FxANotification.strings; sourceTree = ""; }; + 439844192CCFAA410056D868 /* is */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = is; path = is.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 43989F6A2BB1962C008F42B4 /* pa-IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pa-IN"; path = "pa-IN.lproj/BottomSheet.strings"; sourceTree = ""; }; 4398CDB82AC1A2FF00C9AA9E /* ka */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ka; path = ka.lproj/Share.strings; sourceTree = ""; }; 4398CDB92AC1A2FF00C9AA9E /* ka */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ka; path = ka.lproj/TabLocation.strings; sourceTree = ""; }; @@ -4952,6 +5002,8 @@ 439BCD062C85D8BC00E69FCF /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/MainMenu.strings; sourceTree = ""; }; 439BCD072C85D8BC00E69FCF /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/SuggestedSites.strings; sourceTree = ""; }; 439BE0CE2B554A1D00E73966 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/TabToolbar.strings; sourceTree = ""; }; + 439C38712CCFAA9C00DA7301 /* kab */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kab; path = kab.lproj/FxANotification.strings; sourceTree = ""; }; + 439C38722CCFAA9C00DA7301 /* kab */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kab; path = kab.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 439C489B29760575007C3DCD /* CreditCardValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreditCardValidator.swift; sourceTree = ""; }; 439C54832C20551A00C86817 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/ActivityStream.strings; sourceTree = ""; }; 439C54842C20551A00C86817 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/AddressToolbar.strings; sourceTree = ""; }; @@ -4962,6 +5014,8 @@ 439CB65E2AE68F1F00A19D54 /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/Share.strings; sourceTree = ""; }; 439CB65F2AE68F1F00A19D54 /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/ZoomPageBar.strings; sourceTree = ""; }; 439CD47C2BA8584C00C9ECE0 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/BottomSheet.strings; sourceTree = ""; }; + 439CD6962CCFA89C00B59DAC /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/FxANotification.strings"; sourceTree = ""; }; + 439CD6972CCFA89C00B59DAC /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/SearchEngineSelection.strings"; sourceTree = ""; }; 439CDA0A2A124C930040841E /* pa-IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pa-IN"; path = "pa-IN.lproj/FirefoxSync.strings"; sourceTree = ""; }; 439CDA0B2A124C930040841E /* pa-IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pa-IN"; path = "pa-IN.lproj/Upgrade.strings"; sourceTree = ""; }; 439D0A1B2BF50A60009A2CFE /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/BottomSheet.strings; sourceTree = ""; }; @@ -5044,6 +5098,8 @@ 43A328B82C3C0191000E9EAF /* hy-AM */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hy-AM"; path = "hy-AM.lproj/ScanQRCode.strings"; sourceTree = ""; }; 43A36A0D2B8393350057560F /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/KeyboardAccessory.strings; sourceTree = ""; }; 43A36A0E2B8393350057560F /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PasswordAutofill.strings; sourceTree = ""; }; + 43A41E9C2CCFA9610034A1FB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/FxANotification.strings; sourceTree = ""; }; + 43A41E9D2CCFA9610034A1FB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 43A494E1293E0C7700256166 /* sat-Olck */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sat-Olck"; path = "sat-Olck.lproj/Alerts.strings"; sourceTree = ""; }; 43A494E2293E0C7700256166 /* sat-Olck */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sat-Olck"; path = "sat-Olck.lproj/TabsTray.strings"; sourceTree = ""; }; 43A49E662B30607700FC86A9 /* hsb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hsb; path = hsb.lproj/ContextualHints.strings; sourceTree = ""; }; @@ -5066,6 +5122,8 @@ 43A607722AC1A1E4008D8148 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/TabLocation.strings"; sourceTree = ""; }; 43A611CC2B399D4800DE9C4B /* ug */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ug; path = ug.lproj/FirefoxHomepage.strings; sourceTree = ""; }; 43A611CD2B399D4800DE9C4B /* ug */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ug; path = ug.lproj/FirefoxLogins.strings; sourceTree = ""; }; + 43A6704B2CCFAA52003D01EC /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/FxANotification.strings; sourceTree = ""; }; + 43A6704C2CCFAA52003D01EC /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 43A6A12E2A3733C600D41963 /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/Footer.strings; sourceTree = ""; }; 43A6A12F2A3733C600D41963 /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/RememberCard.strings; sourceTree = ""; }; 43A6A1302A3733C600D41963 /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/UpdateCard.strings; sourceTree = ""; }; @@ -5103,6 +5161,8 @@ 43ABC2F82A3733AA001FC18D /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/UpdateCard.strings; sourceTree = ""; }; 43ABCFA82BB193BA005B9C8E /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/BottomSheet.strings; sourceTree = ""; }; 43ABDF182B554A86007D902C /* hsb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hsb; path = hsb.lproj/TabToolbar.strings; sourceTree = ""; }; + 43ABE7182CCFACD600C4E4CB /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/FxANotification.strings; sourceTree = ""; }; + 43ABE7192CCFACD600C4E4CB /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 43AC35692B305F9B00789923 /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/ContextualHints.strings"; sourceTree = ""; }; 43AC356A2B305F9B00789923 /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/CredentialProvider.strings"; sourceTree = ""; }; 43AC356B2B305F9B00789923 /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/Credentials.strings"; sourceTree = ""; }; @@ -5374,6 +5434,8 @@ 43C22F422BE8F4D80043046A /* rm */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = rm; path = rm.lproj/Microsurvey.strings; sourceTree = ""; }; 43C2B2312C57B4560010E539 /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/Toolbar.strings; sourceTree = ""; }; 43C335E028B39F6500858209 /* ta */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ta; path = ta.lproj/BookmarkPanel.strings; sourceTree = ""; }; + 43C36B9B2CCFAD4B00C94BE9 /* ug */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ug; path = ug.lproj/FxANotification.strings; sourceTree = ""; }; + 43C36B9C2CCFAD4B00C94BE9 /* ug */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ug; path = ug.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 43C39FE42A24C0EB000FD072 /* sat-Olck */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sat-Olck"; path = "sat-Olck.lproj/DisplayCard.strings"; sourceTree = ""; }; 43C4236D2AEFC88A00518309 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Shopping.strings"; sourceTree = ""; }; 43C426C42AEFC69B000D7D40 /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/Shopping.strings"; sourceTree = ""; }; @@ -5417,6 +5479,8 @@ 43C6FAAF2C8F147B001C64E9 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/MainMenu.strings; sourceTree = ""; }; 43C6FAB02C8F147B001C64E9 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/NativeErrorPage.strings; sourceTree = ""; }; 43C6FAB12C8F147C001C64E9 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/SuggestedSites.strings; sourceTree = ""; }; + 43C77A8E2CCFAAAE008DDB4E /* kk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kk; path = kk.lproj/FxANotification.strings; sourceTree = ""; }; + 43C77A8F2CCFAAAF008DDB4E /* kk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kk; path = kk.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 43C784792BE8F5DF005E2B49 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Microsurvey.strings; sourceTree = ""; }; 43C79B0D29225BDC00452D0E /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/SearchHeaderTitle.strings; sourceTree = ""; }; 43C7BDC92B0B777300841983 /* kk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kk; path = kk.lproj/FirefoxHomepage.strings; sourceTree = ""; }; @@ -5504,6 +5568,8 @@ 43CD4C742934CF9000753996 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/SearchHeaderTitle.strings; sourceTree = ""; }; 43CD8C0829F69B6900B3ED1C /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Notification.strings; sourceTree = ""; }; 43CD8C0929F69B6900B3ED1C /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/ZoomPageBar.strings; sourceTree = ""; }; + 43CD8E4D2CCFAB8F00351221 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/FxANotification.strings; sourceTree = ""; }; + 43CD8E4E2CCFAB8F00351221 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 43CE859E2BCD467D00EFFAA4 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/BottomSheet.strings; sourceTree = ""; }; 43CE90FA2BE8F36700FFB2D4 /* is */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = is; path = is.lproj/Microsurvey.strings; sourceTree = ""; }; 43CE9F3D2C57B5500069B3AF /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-TW"; path = "zh-TW.lproj/Toolbar.strings"; sourceTree = ""; }; @@ -5517,6 +5583,8 @@ 43CF280028B39A70008DF2C5 /* anp */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = anp; path = anp.lproj/BookmarkPanel.strings; sourceTree = ""; }; 43CF316F2C7C9F0900D898EE /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-TW"; path = "zh-TW.lproj/NativeErrorPage.strings"; sourceTree = ""; }; 43CF76D92B5E84B9001CA9CD /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/TabToolbar.strings; sourceTree = ""; }; + 43CF96F12CCFAAE300BC5281 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/FxANotification.strings; sourceTree = ""; }; + 43CF96F22CCFAAE300BC5281 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 43CFB14C2C7C9A2B003B700F /* co */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = co; path = co.lproj/NativeErrorPage.strings; sourceTree = ""; }; 43CFD03D2B9F1D1000E7EB9E /* be */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = be; path = be.lproj/PasswordAutofill.strings; sourceTree = ""; }; 43D00492296FC48F00CB0F31 /* CreditCardSettingsEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreditCardSettingsEmptyView.swift; sourceTree = ""; }; @@ -5581,6 +5649,8 @@ 43D2F8BB2A8A45570095D4EB /* su */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = su; path = su.lproj/ZoomPageBar.strings; sourceTree = ""; }; 43D2FFFE2AC1A445005BC97C /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Share.strings; sourceTree = ""; }; 43D2FFFF2AC1A445005BC97C /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/TabLocation.strings; sourceTree = ""; }; + 43D334232CCFAD5C004AE196 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/FxANotification.strings; sourceTree = ""; }; + 43D334242CCFAD5C004AE196 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 43D341A02A2DFC150060E3B9 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Footer.strings; sourceTree = ""; }; 43D341A12A2DFC150060E3B9 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/RememberCard.strings; sourceTree = ""; }; 43D341A22A2DFC150060E3B9 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/UpdateCard.strings; sourceTree = ""; }; @@ -5656,6 +5726,8 @@ 43D79C2C2C3C00AF00DF5925 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/EditAddress.strings; sourceTree = ""; }; 43D79C2D2C3C00AF00DF5925 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/ScanQRCode.strings; sourceTree = ""; }; 43D79ED529225A170047FF5D /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/SearchHeaderTitle.strings"; sourceTree = ""; }; + 43D7B4C32CCFA8450093A807 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/FxANotification.strings; sourceTree = ""; }; + 43D7B4C42CCFA8450093A807 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 43D7E4E02C984D0800AF85A8 /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/Bookmarks.strings; sourceTree = ""; }; 43D7E4E12C984D0800AF85A8 /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/MainMenu.strings; sourceTree = ""; }; 43D7E4E22C984D0800AF85A8 /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/SuggestedSites.strings; sourceTree = ""; }; @@ -5807,6 +5879,8 @@ 43E1885A2B83903700A2FB71 /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/KeyboardAccessory.strings; sourceTree = ""; }; 43E1885B2B83903700A2FB71 /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/PasswordAutofill.strings; sourceTree = ""; }; 43E18BBF2A24C09100433C0C /* nn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nn; path = nn.lproj/DisplayCard.strings; sourceTree = ""; }; + 43E1A3CF2CCFAC4300B4178C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/FxANotification.strings; sourceTree = ""; }; + 43E1A3D02CCFAC4300B4178C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 43E1D7B029FFD6B5008F2117 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Notification.strings; sourceTree = ""; }; 43E1D7B129FFD6B5008F2117 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/ZoomPageBar.strings; sourceTree = ""; }; 43E1DCD82C7C9AAB008E952F /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/NativeErrorPage.strings"; sourceTree = ""; }; @@ -5845,6 +5919,8 @@ 43E334052BA85ADD003CF41A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/BottomSheet.strings; sourceTree = ""; }; 43E33D68293E0C30005D1647 /* pa-IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pa-IN"; path = "pa-IN.lproj/Alerts.strings"; sourceTree = ""; }; 43E33D69293E0C30005D1647 /* pa-IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pa-IN"; path = "pa-IN.lproj/TabsTray.strings"; sourceTree = ""; }; + 43E343F22CCFABF700EB2AF0 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/FxANotification.strings"; sourceTree = ""; }; + 43E343F32CCFABF700EB2AF0 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/SearchEngineSelection.strings"; sourceTree = ""; }; 43E393342A37353B007D2C01 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/DisplayCard.strings; sourceTree = ""; }; 43E393352A37353B007D2C01 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Footer.strings; sourceTree = ""; }; 43E393362A37353B007D2C01 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/RememberCard.strings; sourceTree = ""; }; @@ -5993,6 +6069,8 @@ 43EB5FB22B2728090063D23E /* ug */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ug; path = ug.lproj/Localizable.strings; sourceTree = ""; }; 43EB66702B8391C5006D5457 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/KeyboardAccessory.strings; sourceTree = ""; }; 43EB66712B8391C5006D5457 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/PasswordAutofill.strings; sourceTree = ""; }; + 43EBAA042CCFA856004A13C4 /* dsb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = dsb; path = dsb.lproj/FxANotification.strings; sourceTree = ""; }; + 43EBAA052CCFA856004A13C4 /* dsb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = dsb; path = dsb.lproj/SearchEngineSelection.strings; sourceTree = ""; }; 43EBB24B2BA85A81009E2A93 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/BottomSheet.strings"; sourceTree = ""; }; 43EBF7062A3735DC00E56F21 /* rm */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = rm; path = rm.lproj/Footer.strings; sourceTree = ""; }; 43EBF7072A3735DC00E56F21 /* rm */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = rm; path = rm.lproj/RememberCard.strings; sourceTree = ""; }; @@ -6103,6 +6181,8 @@ 43F37876293E0B7C005F1168 /* ka */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ka; path = ka.lproj/TabsTray.strings; sourceTree = ""; }; 43F3AB252B554C7600CAEC9A /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/TabToolbar.strings; sourceTree = ""; }; 43F3B77D29E4284E00016345 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = "pl.lproj/Edit Card.strings"; sourceTree = ""; }; + 43F3E77C2CCFAC090083E000 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/FxANotification.strings"; sourceTree = ""; }; + 43F3E77D2CCFAC090083E000 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/SearchEngineSelection.strings"; sourceTree = ""; }; 43F3EF6429E425C800514BC1 /* en-CA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-CA"; path = "en-CA.lproj/Edit Card.strings"; sourceTree = ""; }; 43F416382A24C01400E60484 /* kk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kk; path = kk.lproj/DisplayCard.strings; sourceTree = ""; }; 43F417632BB1945E00EBC968 /* hsb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hsb; path = hsb.lproj/BottomSheet.strings; sourceTree = ""; }; @@ -8145,7 +8225,6 @@ D301AAED1A3A55B70078DD1D /* LegacyGridTabViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyGridTabViewController.swift; sourceTree = ""; }; D3024F988AFC5EF8EC2878D0 /* lo */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lo; path = lo.lproj/ErrorPages.strings; sourceTree = ""; }; D30684F01C84F12A002D8D82 /* SearchPlugins */ = {isa = PBXFileReference; lastKnownFileType = folder; name = SearchPlugins; path = Search/SearchPlugins; sourceTree = ""; }; - D308E4E31A5306F500842685 /* SearchEngines.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchEngines.swift; sourceTree = ""; }; D308EE551CBF0BF5006843F2 /* CertError.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = CertError.css; sourceTree = ""; }; D30B101D1AA7F9C600C01CA3 /* LibraryPanelHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryPanelHelper.swift; sourceTree = ""; }; D313BE971B2F5096009EF241 /* DomainAutocompleteTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomainAutocompleteTests.swift; sourceTree = ""; }; @@ -8983,6 +9062,12 @@ EC734AD49E5483F11375E891 /* zh-CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-CN"; path = "zh-CN.lproj/AuthenticationManager.strings"; sourceTree = ""; }; EC934F7BB2F8B247BC714BE2 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-TW"; path = "zh-TW.lproj/ClearPrivateData.strings"; sourceTree = ""; }; ECDA4593850BA4E08FDAC5AF /* kk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kk; path = kk.lproj/ClearPrivateData.strings; sourceTree = ""; }; + ED07C0E52CCACD7E006C0627 /* Locale+possibilitiesForLanguageIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Locale+possibilitiesForLanguageIdentifier.swift"; sourceTree = ""; }; + ED07C0E92CCADCD5006C0627 /* SearchEngineSelectionState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchEngineSelectionState.swift; sourceTree = ""; }; + ED07C0EC2CCAE745006C0627 /* SearchEngineSelectionAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchEngineSelectionAction.swift; sourceTree = ""; }; + ED07C0EE2CCAE856006C0627 /* SearchEngineSelectionMiddleware.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchEngineSelectionMiddleware.swift; sourceTree = ""; }; + ED07C0F02CCAFEC2006C0627 /* SearchEngineSelectionStateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchEngineSelectionStateTests.swift; sourceTree = ""; }; + ED07C0F32CCB0200006C0627 /* SearchEngineSelectionMiddlewareTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchEngineSelectionMiddlewareTests.swift; sourceTree = ""; }; ED264785844AD63AD616A882 /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/InfoPlist.strings; sourceTree = ""; }; ED28DAC82C45A95F00D2641C /* TabScrollBehaviorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabScrollBehaviorModel.swift; sourceTree = ""; }; ED364EECB95B96AB639A82DE /* su */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = su; path = su.lproj/Localizable.strings; sourceTree = ""; }; @@ -8995,6 +9080,7 @@ EDA240A8BBFD0A19FB2C3D7E /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Intro.strings; sourceTree = ""; }; EDB94DDC89DE1F2C624C9841 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/InfoPlist.strings; sourceTree = ""; }; EDBE49119AB71D7076BC2CA3 /* zh-CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-CN"; path = "zh-CN.lproj/Menu.strings"; sourceTree = ""; }; + EDC3C2552CCAC9CB005A047F /* SearchEnginesManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchEnginesManager.swift; sourceTree = ""; }; EDC3D34E2CB5E70500C62DE3 /* SearchEngineTestAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = SearchEngineTestAssets.xcassets; sourceTree = ""; }; EDC3D3542CB70A3F00C62DE3 /* OpenSearchEngineTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenSearchEngineTests.swift; sourceTree = ""; }; EDCA4CBC8077FC37971CC0C7 /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kn; path = kn.lproj/Localizable.strings; sourceTree = ""; }; @@ -9929,6 +10015,7 @@ E1442FC9294782D8003680B0 /* URL+Mail.swift */, 1BE7A48F2C636AC800460798 /* URLSession+sharedMPTCP.swift */, 1BE7A4912C636AEA00460798 /* URLSessionConfiguration+defaultMPTCP.swift */, + ED07C0E52CCACD7E006C0627 /* Locale+possibilitiesForLanguageIdentifier.swift */, ); path = Extensions; sourceTree = ""; @@ -10850,8 +10937,9 @@ 8A1E3BE428CBBF1E003388C4 /* SearchEngines */ = { isa = PBXGroup; children = ( + ED07C0EA2CCADCD5006C0627 /* Redux */, ED371A692CB885B20099F3C8 /* Views */, - D308E4E31A5306F500842685 /* SearchEngines.swift */, + EDC3C2552CCAC9CB005A047F /* SearchEnginesManager.swift */, 8A1E3BE528CBBF44003388C4 /* OpenSearchEngine.swift */, D3FA77831A43B2CE0010CD32 /* OpenSearchParser.swift */, 96A5F72F298D8BEE00234E5F /* DefaultSearchEngineProvider.swift */, @@ -10864,11 +10952,13 @@ isa = PBXGroup; children = ( EDC3D3542CB70A3F00C62DE3 /* OpenSearchEngineTests.swift */, - 2F697F7D1A9FD22D009E03AE /* SearchEnginesTests.swift */, + 2F697F7D1A9FD22D009E03AE /* SearchEnginesManagerTests.swift */, ED45893D2CC800D9006F2C0B /* SearchEngineSelectionViewControllerTests.swift */, D3FA777A1A43B2990010CD32 /* SearchTests.swift */, 96A5F734298D8EB900234E5F /* MockSearchEngineProvider.swift */, EDC3D34E2CB5E70500C62DE3 /* SearchEngineTestAssets.xcassets */, + ED07C0F02CCAFEC2006C0627 /* SearchEngineSelectionStateTests.swift */, + ED07C0F32CCB0200006C0627 /* SearchEngineSelectionMiddlewareTests.swift */, ); path = SearchEngines; sourceTree = ""; @@ -13235,6 +13325,8 @@ 43C50B4E2A0BCAA800C6A134 /* FirefoxSync.strings */, 43A7153B2A2DF94F00DD5747 /* Footer.strings */, E4E0BB171AFBC9E4008D6260 /* Info.plist */, + 436033C72CCFA811000BBEA2 /* SearchEngineSelection.strings */, + 436033C42CCFA811000BBEA2 /* FxANotification.strings */, 43E168912CA183A400E67516 /* PasswordGenerator.strings */, 434707672C85D3DA009585F0 /* SuggestedSites.strings */, 43079D212C85D3BB0047C28D /* MainMenu.strings */, @@ -13509,6 +13601,16 @@ path = InternalSchemeHandler; sourceTree = ""; }; + ED07C0EA2CCADCD5006C0627 /* Redux */ = { + isa = PBXGroup; + children = ( + ED07C0E92CCADCD5006C0627 /* SearchEngineSelectionState.swift */, + ED07C0EC2CCAE745006C0627 /* SearchEngineSelectionAction.swift */, + ED07C0EE2CCAE856006C0627 /* SearchEngineSelectionMiddleware.swift */, + ); + path = Redux; + sourceTree = ""; + }; ED371A692CB885B20099F3C8 /* Views */ = { isa = PBXGroup; children = ( @@ -14724,6 +14826,7 @@ 43B966AF2BE8F11D007448EA /* Microsurvey.strings in Resources */, 431F0C4A2AC1A112006D7D49 /* TabLocation.strings in Resources */, 43903A8F2C20502A00ACF76E /* EnhancedTrackingProtection.strings in Resources */, + 436033C62CCFA811000BBEA2 /* FxANotification.strings in Resources */, 43A878172B838FF90039D6B7 /* PasswordAutofill.strings in Resources */, 43E6BE162C57AF7600C2152C /* Toolbar.strings in Resources */, D59643E725C9B8E000EAB8B9 /* Intro.strings in Resources */, @@ -14742,6 +14845,7 @@ 43903A922C20502A00ACF76E /* QRCode.strings in Resources */, 43903A8C2C20502A00ACF76E /* AddressToolbar.strings in Resources */, 43FA49A329C875C0005062DB /* SnackBar.strings in Resources */, + 436033C92CCFA811000BBEA2 /* SearchEngineSelection.strings in Resources */, 439A221229F69A0C00F120EE /* ZoomPageBar.strings in Resources */, 43B296372B305F1E00A5AA9B /* Credentials.strings in Resources */, 43B296342B305F1E00A5AA9B /* CredentialProvider.strings in Resources */, @@ -15567,6 +15671,7 @@ E1A6AB4628CA6A4C00EBEBDD /* String+Extension.swift in Sources */, 1D2F68AF2ACB272500524B92 /* RemoteTabsTableViewController.swift in Sources */, 210887CC293E8800000AB4EE /* LegacyRemoteTabsErrorCell.swift in Sources */, + ED07C0ED2CCAE745006C0627 /* SearchEngineSelectionAction.swift in Sources */, 8AABBCFC2A0010900089941E /* GleanWrapper.swift in Sources */, 8C92DE912A7128CB0090BD28 /* ProductAnalysisResponse.swift in Sources */, F85C7F0F271DD154004BDBA4 /* AppAuthenticator.swift in Sources */, @@ -15635,6 +15740,7 @@ 6ACB550C28633860007A6ABD /* TabManagerNavDelegate.swift in Sources */, E18259DF29B25E4F00E6BE76 /* UserNotificationCenterProtocol.swift in Sources */, DFFC9AD12A681FA0002A6AAD /* NimbusFakespotFeatureLayer.swift in Sources */, + ED07C0EB2CCADCD5006C0627 /* SearchEngineSelectionState.swift in Sources */, 1DEBC55E2AC4ED70006E4801 /* RemoteTabsPanel.swift in Sources */, 435D660523D794B90046EFA2 /* UpdateViewModel.swift in Sources */, 9658143C29FAB610007339BD /* CreditCardInputFieldHelper.swift in Sources */, @@ -15667,6 +15773,7 @@ 8AE80BBC2891C20D00BC12EA /* JumpBackInList.swift in Sources */, 8A395552299AF83400B2AFBB /* UIControl+Extension.swift in Sources */, C2A72A692A769460002ACCE2 /* ReadingListCoordinator.swift in Sources */, + EDC3C2562CCAC9CB005A047F /* SearchEnginesManager.swift in Sources */, F85C7F122721048E004BDBA4 /* Layout.swift in Sources */, DF036E43274FD434002E834E /* HistoryHighlightsCell.swift in Sources */, B2FEA68D2B460D390058E616 /* AddressAutofillSettingsViewController.swift in Sources */, @@ -15692,7 +15799,6 @@ E4B423DD1ABA0318007E66C8 /* ReaderModeHandlers.swift in Sources */, E177989C2BD7D48500F6F0EB /* ToolbarAction.swift in Sources */, F8A0B08229AD61FA0091C75B /* RustSyncManager.swift in Sources */, - D308E4E41A5306F500842685 /* SearchEngines.swift in Sources */, 438FE8642988ABA600155B10 /* CreditCardTableViewController.swift in Sources */, 3BCE6D3C1CEB9E4D0080928C /* ThirdPartySearchAlerts.swift in Sources */, 8A93F86229D36F0F004159D9 /* NavigationController.swift in Sources */, @@ -16191,6 +16297,7 @@ 1DA6F6512B48B42900BB5AD6 /* WindowEventCoordinator.swift in Sources */, 0B11AF022CB412D100AD51D5 /* Metrics.swift in Sources */, C4E3984C1D21F2FD004E89BA /* TabTrayButtonExtensions.swift in Sources */, + ED07C0E62CCACD7E006C0627 /* Locale+possibilitiesForLanguageIdentifier.swift in Sources */, 437A857827E43FE100E42764 /* FxAWebViewTelemetry.swift in Sources */, E13E9AB42AAB0FB5001A0E9D /* FakespotCoordinator.swift in Sources */, E1442FD1294782D9003680B0 /* UIModalPresentationStyle+Photon.swift in Sources */, @@ -16307,6 +16414,7 @@ C84655E42887394B00861B4A /* WallpaperMetadata.swift in Sources */, 8AB8572E27D94A1A0075C173 /* UXSizeClass.swift in Sources */, 965C3C8F29313A1B006499ED /* AppSessionManager.swift in Sources */, + ED07C0EF2CCAE856006C0627 /* SearchEngineSelectionMiddleware.swift in Sources */, 45D5EDA729269F7500311934 /* DataObserver.swift in Sources */, 81A3F6F02C2DAEE200BDD86B /* MainMenuCoordinator.swift in Sources */, 961577922A38FDB300391E8D /* SponsoredTileDataUtility.swift in Sources */, @@ -16539,7 +16647,7 @@ 96AF8C1C29FC14F700EC2219 /* CreditCardInputFieldHelperTests.swift in Sources */, 21FA8FB02AE856590013B815 /* RemoteTabsCoordinatorTests.swift in Sources */, C80C11F428B3CD580062922A /* MockUserDefaultsTests.swift in Sources */, - 2F697F7E1A9FD22D009E03AE /* SearchEnginesTests.swift in Sources */, + 2F697F7E1A9FD22D009E03AE /* SearchEnginesManagerTests.swift in Sources */, 2197DF8A287624BF00215624 /* LibraryViewModelTests.swift in Sources */, 5A3A7DDC2889EC5D0065F81A /* BookmarksHandlerMock.swift in Sources */, 2F44FA1B1A9D426A00FD20CC /* TestHashExtensions.swift in Sources */, @@ -16567,6 +16675,7 @@ 8A5D1CA02A30C9D7005AD35C /* MockAppSettingsDelegate.swift in Sources */, 1D7B789F2AE088930011E9F2 /* EventQueueTests.swift in Sources */, 21A1C3C72996AFF800181B7C /* OverlayModeManagerTests.swift in Sources */, + ED07C0F52CCB020B006C0627 /* SearchEngineSelectionMiddlewareTests.swift in Sources */, C8DF92F72A14101500AA7B05 /* OnboardingViewControllerProtocolTests.swift in Sources */, 8A4EA0D92C01127C00E4E4F1 /* MicrosurveyMockModel.swift in Sources */, 1D4D79472BF2F4FD007C6796 /* Throttler.swift in Sources */, @@ -16629,6 +16738,7 @@ 8CEDF07E2BFE04B100D2617B /* AddressListViewModelTests.swift in Sources */, 21D884412A79628E00AF144C /* MockSettingsDelegate.swift in Sources */, F1BC457E2A40F6D2005541D5 /* EnhancedTrackingProtectionCoordinatorTests.swift in Sources */, + ED07C0F22CCAFED1006C0627 /* SearchEngineSelectionStateTests.swift in Sources */, 8A13FA8F2AD83F00007527AB /* DefaultBackgroundTabLoaderTests.swift in Sources */, 8A827E362C20CB5B008D5E3C /* MicrosurveyPromptMiddlewareTests.swift in Sources */, 5A31275828906422001F30FA /* BookmarksDelegateMock.swift in Sources */, @@ -16847,7 +16957,6 @@ FA6B2AC41D41F02D00429414 /* String+Punycode.swift in Sources */, E1D6F2D928E32A5300B2C8CC /* ImageIdentifiers.swift in Sources */, F8A0B08429AD64790091C75B /* RustSyncManager.swift in Sources */, - D38B2D8A1A8D98D00040E6B5 /* SearchEngines.swift in Sources */, EB6E0C60207E6C3100FBFF7E /* SendToDevice.swift in Sources */, D3C744CF1A687D6C004CE85D /* URIFixup.swift in Sources */, EB94075320850C9F00702E05 /* photon-colors.swift in Sources */, @@ -16856,6 +16965,7 @@ D04CD74D216CF86F004FF5B0 /* DevicePickerViewController.swift in Sources */, 6025B10F267B6C7F00F59F6B /* LoginRecordExtension.swift in Sources */, E418D0D91A251B3200CAE47A /* Profile.swift in Sources */, + ED07C0E72CCACE18006C0627 /* Locale+possibilitiesForLanguageIdentifier.swift in Sources */, E1CD81C3290C670A00124B27 /* HostingTableViewCell.swift in Sources */, DDA24A451FD84D630098F159 /* DefaultSearchPrefs.swift in Sources */, F8708D321A0970B70051AB07 /* ShareViewController.swift in Sources */, @@ -17578,6 +17688,7 @@ 43CEB5072CA1877E008C4E6F /* pl */, 43D3E3F02CAABFF100205186 /* es */, 43C93FB42CBD35B30006D3F8 /* gd */, + 430BD28E2CCFAAF5006DD679 /* lo */, ); name = MainMenu.strings; sourceTree = ""; @@ -18184,6 +18295,91 @@ name = ToolbarLocation.strings; sourceTree = ""; }; + 436033C42CCFA811000BBEA2 /* FxANotification.strings */ = { + isa = PBXVariantGroup; + children = ( + 436033C52CCFA811000BBEA2 /* cs */, + 4371D0022CCFA8220002360A /* cy */, + 43D7B4C32CCFA8450093A807 /* de */, + 43EBAA042CCFA856004A13C4 /* dsb */, + 431851832CCFA868008A5045 /* el */, + 438502862CCFA88A00172282 /* en-GB */, + 439CD6962CCFA89C00B59DAC /* en-US */, + 430F22A52CCFA8D000256A3B /* es-AR */, + 433D70502CCFA8E2008704C8 /* es-CL */, + 434B6DD52CCFA8F400272920 /* es */, + 4315E7522CCFA92D003BEB39 /* eu */, + 43A41E9C2CCFA9610034A1FB /* fr */, + 435C718B2CCFA9B700B9D395 /* he */, + 438E87B12CCFA9EB00A2538C /* hsb */, + 430F21512CCFAA0D00576881 /* hy-AM */, + 431D2B922CCFAA1E002D802C /* ia */, + 439844182CCFAA410056D868 /* is */, + 43A6704B2CCFAA52003D01EC /* it */, + 439C38712CCFAA9C00DA7301 /* kab */, + 43C77A8E2CCFAAAE008DDB4E /* kk */, + 43CF96F12CCFAAE300BC5281 /* ko */, + 43CD8E4D2CCFAB8F00351221 /* nl */, + 434500692CCFABA000C4DC75 /* nn */, + 43E343F22CCFABF700EB2AF0 /* pt-BR */, + 43F3E77C2CCFAC090083E000 /* pt-PT */, + 43E1A3CF2CCFAC4300B4178C /* ru */, + 430175A12CCFAC8F000DFF93 /* sk */, + 4327C7D52CCFACA100E79AF8 /* sl */, + 43ABE7182CCFACD600C4E4CB /* sv */, + 435D89402CCFAD290034F043 /* tr */, + 43C36B9B2CCFAD4B00C94BE9 /* ug */, + 43D334232CCFAD5C004AE196 /* uk */, + 434720C72CCFAD8E007554E9 /* vi */, + 436742352CCFADB00033AA35 /* zh-CN */, + 4375B35D2CCFADC1000DB6C1 /* zh-TW */, + ); + name = FxANotification.strings; + sourceTree = ""; + }; + 436033C72CCFA811000BBEA2 /* SearchEngineSelection.strings */ = { + isa = PBXVariantGroup; + children = ( + 436033C82CCFA811000BBEA2 /* cs */, + 4371D0032CCFA8230002360A /* cy */, + 43D7B4C42CCFA8450093A807 /* de */, + 43EBAA052CCFA856004A13C4 /* dsb */, + 431851842CCFA868008A5045 /* el */, + 438502872CCFA88B00172282 /* en-GB */, + 439CD6972CCFA89C00B59DAC /* en-US */, + 430F22A62CCFA8D000256A3B /* es-AR */, + 433D70512CCFA8E2008704C8 /* es-CL */, + 434B6DD62CCFA8F400272920 /* es */, + 4315E7532CCFA92D003BEB39 /* eu */, + 4337EC742CCFA950002FAA92 /* fi */, + 43A41E9D2CCFA9610034A1FB /* fr */, + 435C718C2CCFA9B700B9D395 /* he */, + 438E87B22CCFA9EB00A2538C /* hsb */, + 430F21522CCFAA0D00576881 /* hy-AM */, + 431D2B932CCFAA1E002D802C /* ia */, + 439844192CCFAA410056D868 /* is */, + 43A6704C2CCFAA52003D01EC /* it */, + 439C38722CCFAA9C00DA7301 /* kab */, + 43C77A8F2CCFAAAF008DDB4E /* kk */, + 43CF96F22CCFAAE300BC5281 /* ko */, + 43CD8E4E2CCFAB8F00351221 /* nl */, + 4345006A2CCFABA000C4DC75 /* nn */, + 43E343F32CCFABF700EB2AF0 /* pt-BR */, + 43F3E77D2CCFAC090083E000 /* pt-PT */, + 43E1A3D02CCFAC4300B4178C /* ru */, + 430175A22CCFAC8F000DFF93 /* sk */, + 4327C7D62CCFACA100E79AF8 /* sl */, + 43ABE7192CCFACD600C4E4CB /* sv */, + 435D89412CCFAD290034F043 /* tr */, + 43C36B9C2CCFAD4B00C94BE9 /* ug */, + 43D334242CCFAD5C004AE196 /* uk */, + 434720C82CCFAD8E007554E9 /* vi */, + 436742362CCFADB00033AA35 /* zh-CN */, + 4375B35E2CCFADC1000DB6C1 /* zh-TW */, + ); + name = SearchEngineSelection.strings; + sourceTree = ""; + }; 4369B87F2B0B75A8003791B9 /* FirefoxHomepage.strings */ = { isa = PBXVariantGroup; children = ( @@ -24981,7 +25177,7 @@ repositoryURL = "https://github.com/mozilla/rust-components-swift.git"; requirement = { kind = exactVersion; - version = 133.0.20241022050402; + version = 133.0.20241027050311; }; }; 435C85EE2788F4D00072B526 /* XCRemoteSwiftPackageReference "glean-swift" */ = { diff --git a/firefox-ios/Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/firefox-ios/Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 95a5581c6e1f..bbaac616f959 100644 --- a/firefox-ios/Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/firefox-ios/Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/mozilla/rust-components-swift.git", "state" : { - "revision" : "89084ef67f53473c5312b9cafd5e9bf225ef888b", - "version" : "133.0.20241022050402" + "revision" : "e891a641517fc8c76097e33a77b3e92818fc5656", + "version" : "133.0.20241027050311" } }, { diff --git a/firefox-ios/Client/Extensions/Locale+possibilitiesForLanguageIdentifier.swift b/firefox-ios/Client/Extensions/Locale+possibilitiesForLanguageIdentifier.swift new file mode 100644 index 000000000000..fb16fc32a2eb --- /dev/null +++ b/firefox-ios/Client/Extensions/Locale+possibilitiesForLanguageIdentifier.swift @@ -0,0 +1,26 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/ + +import Foundation + +extension Locale { + func possibilitiesForLanguageIdentifier() -> [String] { + var possibilities: [String] = [] + let components = identifier.components(separatedBy: "-") + + possibilities.append(identifier) + + if components.count == 3, + let first = components.first, + let last = components.last { + possibilities.append("\(first)-\(last)") + } + if components.count >= 2, + let first = components.first { + possibilities.append("\(first)") + } + + return possibilities + } +} diff --git a/firefox-ios/Client/Frontend/Autofill/Address/Edit/RemoveAddressButton.swift b/firefox-ios/Client/Frontend/Autofill/Address/Edit/RemoveAddressButton.swift index 712b7a6e5505..d4da6dfd504b 100644 --- a/firefox-ios/Client/Frontend/Autofill/Address/Edit/RemoveAddressButton.swift +++ b/firefox-ios/Client/Frontend/Autofill/Address/Edit/RemoveAddressButton.swift @@ -48,7 +48,7 @@ class RemoveAddressButton: UIButton, ThemeApplicable { func applyTheme(theme: any Theme) { let color = theme.colors backgroundColor = color.layer2 - setTitleColor(color.textWarning, for: .normal) + setTitleColor(color.textCritical, for: .normal) topSeparator.backgroundColor = color.borderPrimary bottomSeparator.backgroundColor = color.borderPrimary } diff --git a/firefox-ios/Client/Frontend/Autofill/CreditCard/ViewComponents/CreditCardInputField.swift b/firefox-ios/Client/Frontend/Autofill/CreditCard/ViewComponents/CreditCardInputField.swift index 0a473463c8e3..bfed13f59e7c 100644 --- a/firefox-ios/Client/Frontend/Autofill/CreditCard/ViewComponents/CreditCardInputField.swift +++ b/firefox-ios/Client/Frontend/Autofill/CreditCard/ViewComponents/CreditCardInputField.swift @@ -125,7 +125,7 @@ struct CreditCardInputField: View { func applyTheme(theme: Theme) { let color = theme.colors - errorColor = Color(color.textWarning) + errorColor = Color(color.textCritical) titleColor = Color(color.textSecondary) textFieldColor = Color(color.textPrimary) backgroundColor = Color(color.layer2) diff --git a/firefox-ios/Client/Frontend/Autofill/CreditCard/ViewComponents/RemoveCardButton.swift b/firefox-ios/Client/Frontend/Autofill/CreditCard/ViewComponents/RemoveCardButton.swift index 151c62a5512e..c896b74b019d 100644 --- a/firefox-ios/Client/Frontend/Autofill/CreditCard/ViewComponents/RemoveCardButton.swift +++ b/firefox-ios/Client/Frontend/Autofill/CreditCard/ViewComponents/RemoveCardButton.swift @@ -77,7 +77,7 @@ struct RemoveCardButton: View { func applyTheme(theme: Theme) { let color = theme.colors backgroundColor = Color(color.layer2) - removeButtonColor = Color(color.textWarning) + removeButtonColor = Color(color.textCritical) borderColor = Color(color.borderPrimary) } } diff --git a/firefox-ios/Client/Frontend/Browser/BrowserViewController/Extensions/BrowserViewController+URLBarDelegate.swift b/firefox-ios/Client/Frontend/Browser/BrowserViewController/Extensions/BrowserViewController+URLBarDelegate.swift index 225b77aa3c86..176aeba55653 100644 --- a/firefox-ios/Client/Frontend/Browser/BrowserViewController/Extensions/BrowserViewController+URLBarDelegate.swift +++ b/firefox-ios/Client/Frontend/Browser/BrowserViewController/Extensions/BrowserViewController+URLBarDelegate.swift @@ -206,7 +206,7 @@ extension BrowserViewController: URLBarDelegate { if let url = searchURL, InternalURL.isValid(url: url) { searchURL = url } - if let query = profile.searchEngines.queryForSearchURL(searchURL as URL?) { + if let query = profile.searchEnginesManager.queryForSearchURL(searchURL as URL?) { return (query, true) } else { return (url?.absoluteString, false) @@ -255,7 +255,7 @@ extension BrowserViewController: URLBarDelegate { } func submitSearchText(_ text: String, forTab tab: Tab) { - guard let engine = profile.searchEngines.defaultEngine, + guard let engine = profile.searchEnginesManager.defaultEngine, let searchURL = engine.searchURLForQuery(text) else { DefaultLogger.shared.log("Error handling URL entry: \"\(text)\".", level: .warning, category: .tabs) diff --git a/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift b/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift index 9071aa0243d3..bfd03cd81782 100644 --- a/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift +++ b/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift @@ -1572,12 +1572,12 @@ class BrowserViewController: UIViewController, let searchViewModel = SearchViewModel(isPrivate: isPrivate, isBottomSearchBar: isBottomSearchBar, profile: profile, - model: profile.searchEngines, + model: profile.searchEnginesManager, tabManager: tabManager) let searchController = SearchViewController(profile: profile, viewModel: searchViewModel, tabManager: tabManager) - searchViewModel.searchEngines = profile.searchEngines + searchViewModel.searchEnginesManager = profile.searchEnginesManager searchController.searchDelegate = self let searchLoader = SearchLoader( @@ -2581,7 +2581,7 @@ class BrowserViewController: UIViewController, func openSearchNewTab(isPrivate: Bool = false, _ text: String) { popToBVC() - guard let engine = profile.searchEngines.defaultEngine, + guard let engine = profile.searchEnginesManager.defaultEngine, let searchURL = engine.searchURLForQuery(text) else { DefaultLogger.shared.log("Error handling URL entry: \"\(text)\".", level: .warning, category: .tabs) @@ -2994,7 +2994,7 @@ class BrowserViewController: UIViewController, .searchScreenState .showSearchSugestionsView ?? false - let isSettingEnabled = profile.searchEngines.shouldShowPrivateModeSearchSuggestions + let isSettingEnabled = profile.searchEnginesManager.shouldShowPrivateModeSearchSuggestions return featureFlagEnabled && !alwaysShowSearchSuggestionsView && !isSettingEnabled } diff --git a/firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuConfigurationUtility.swift b/firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuConfigurationUtility.swift index af69fb22ea79..ea74753adef5 100644 --- a/firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuConfigurationUtility.swift +++ b/firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuConfigurationUtility.swift @@ -12,6 +12,7 @@ struct MainMenuConfigurationUtility: Equatable { static let newTab = StandardImageIdentifiers.Large.plus static let newPrivateTab = StandardImageIdentifiers.Large.privateModeCircleFill static let deviceDesktop = StandardImageIdentifiers.Large.deviceDesktop + static let deviceMobile = StandardImageIdentifiers.Large.deviceMobile static let findInPage = StandardImageIdentifiers.Large.search static let tools = StandardImageIdentifiers.Large.tool static let save = StandardImageIdentifiers.Large.save @@ -138,26 +139,7 @@ struct MainMenuConfigurationUtility: Equatable { ) -> MenuSection { return MenuSection( options: [ - MenuElement( - title: getUserAgentTitle( - defaultIsDesktop: configuration.isDefaultUserAgentDesktop, - tabHasChangedUserAgent: configuration.hasChangedUserAgent - ), - iconName: Icons.deviceDesktop, - isEnabled: true, - isActive: false, - a11yLabel: .MainMenu.ToolsSection.AccessibilityLabels.SwitchToDesktopSite, - a11yHint: "", - a11yId: AccessibilityIdentifiers.MainMenu.switchToDesktopSite, - action: { - store.dispatch( - MainMenuAction( - windowUUID: uuid, - actionType: MainMenuActionType.tapToggleUserAgent - ) - ) - } - ), + configureUserAgentItem(with: uuid, tabInfo: configuration), MenuElement( title: .MainMenu.ToolsSection.FindInPage, iconName: Icons.findInPage, @@ -218,25 +200,48 @@ struct MainMenuConfigurationUtility: Equatable { ) } - private func getUserAgentTitle( - defaultIsDesktop: Bool, - tabHasChangedUserAgent: Bool - ) -> String { + private func configureUserAgentItem( + with uuid: WindowUUID, + tabInfo: MainMenuTabInfo + ) -> MenuElement { typealias Menu = String.MainMenu.ToolsSection + typealias A11y = String.MainMenu.ToolsSection.AccessibilityLabels - // Our default User Agent gets set depending on the architecture we're - // running on. For example, if we're building on an Intel Mac, we get - // desktop User Agent by default. Thus, to determine which string to use, - // we need to know: - // 1) which architecture we've started from and - // 2) whether or not we've requested to change the user agent in the tab - // Using this information, we're able to present the correct string for - // the "Request Mobile/Desktop Site" menu option - if defaultIsDesktop { - return tabHasChangedUserAgent ? Menu.SwitchToDesktopSite : Menu.SwitchToMobileSite + let title: String = if tabInfo.isDefaultUserAgentDesktop { + tabInfo.hasChangedUserAgent ? Menu.SwitchToDesktopSite : Menu.SwitchToMobileSite } else { - return tabHasChangedUserAgent ? Menu.SwitchToMobileSite : Menu.SwitchToDesktopSite + tabInfo.hasChangedUserAgent ? Menu.SwitchToMobileSite : Menu.SwitchToDesktopSite } + + let icon: String = if tabInfo.isDefaultUserAgentDesktop { + tabInfo.hasChangedUserAgent ? Icons.deviceDesktop : Icons.deviceMobile + } else { + tabInfo.hasChangedUserAgent ? Icons.deviceMobile : Icons.deviceDesktop + } + + let a11yLabel: String = if tabInfo.isDefaultUserAgentDesktop { + tabInfo.hasChangedUserAgent ? A11y.SwitchToDesktopSite : A11y.SwitchToMobileSite + } else { + tabInfo.hasChangedUserAgent ? A11y.SwitchToMobileSite : A11y.SwitchToDesktopSite + } + + return MenuElement( + title: title, + iconName: icon, + isEnabled: true, + isActive: false, + a11yLabel: a11yLabel, + a11yHint: "", + a11yId: AccessibilityIdentifiers.MainMenu.switchToDesktopSite, + action: { + store.dispatch( + MainMenuAction( + windowUUID: uuid, + actionType: MainMenuActionType.tapToggleUserAgent + ) + ) + } + ) } // MARK: - Tools Submenu @@ -613,7 +618,8 @@ struct MainMenuConfigurationUtility: Equatable { iconName: Icons.whatsNew, isEnabled: true, isActive: false, - a11yLabel: .MainMenu.OtherToolsSection.AccessibilityLabels.WhatsNew, + a11yLabel: String(format: .MainMenu.OtherToolsSection.AccessibilityLabels.WhatsNew, + AppName.shortName.rawValue), a11yHint: "", a11yId: AccessibilityIdentifiers.MainMenu.whatsNew, action: { diff --git a/firefox-ios/Client/Frontend/Browser/Search/SearchViewController.swift b/firefox-ios/Client/Frontend/Browser/Search/SearchViewController.swift index d5d9075a1d31..e7c7df5259fd 100644 --- a/firefox-ios/Client/Frontend/Browser/Search/SearchViewController.swift +++ b/firefox-ios/Client/Frontend/Browser/Search/SearchViewController.swift @@ -328,7 +328,7 @@ class SearchViewController: SiteTableViewController, ] ) - if engine === self.viewModel.searchEngines?.quickSearchEngines.last { + if engine === self.viewModel.searchEnginesManager?.quickSearchEngines.last { engineButton.trailingAnchor.constraint( equalTo: searchEngineScrollViewContent.trailingAnchor ).isActive = true @@ -436,7 +436,7 @@ class SearchViewController: SiteTableViewController, searchTelemetry?.engagementType = .tap switch SearchListSection(rawValue: indexPath.section)! { case .searchSuggestions: - guard let defaultEngine = viewModel.searchEngines?.defaultEngine else { return } + guard let defaultEngine = viewModel.searchEnginesManager?.defaultEngine else { return } searchTelemetry?.selectedResult = .searchSuggest // Assume that only the default search engine can provide search suggestions. @@ -525,7 +525,7 @@ class SearchViewController: SiteTableViewController, case SearchListSection.firefoxSuggestions.rawValue: title = .Search.SuggestSectionTitle case SearchListSection.searchSuggestions.rawValue: - title = viewModel.searchEngines?.defaultEngine?.headerSearchTitle ?? "" + title = viewModel.searchEnginesManager?.defaultEngine?.headerSearchTitle ?? "" default: title = "" } diff --git a/firefox-ios/Client/Frontend/Browser/Search/SearchViewModel.swift b/firefox-ios/Client/Frontend/Browser/Search/SearchViewModel.swift index 4c0185d284aa..17b0bea9b908 100644 --- a/firefox-ios/Client/Frontend/Browser/Search/SearchViewModel.swift +++ b/firefox-ios/Client/Frontend/Browser/Search/SearchViewModel.swift @@ -24,7 +24,7 @@ class SearchViewModel: FeatureFlaggable, LoaderListener { var filteredOpenedTabs = [Tab]() var searchHighlights = [HighlightItem]() var firefoxSuggestions = [RustFirefoxSuggestion]() - let model: SearchEngines + let model: SearchEnginesManager var suggestions: [String]? = [] static var userAgent: String? var searchFeature: FeatureHolder @@ -52,22 +52,22 @@ class SearchViewModel: FeatureFlaggable, LoaderListener { } var quickSearchEngines: [OpenSearchEngine] { - guard let defaultEngine = searchEngines?.defaultEngine else { return [] } + guard let defaultEngine = searchEnginesManager?.defaultEngine else { return [] } - var engines = searchEngines?.quickSearchEngines + var engines = searchEnginesManager?.quickSearchEngines // If we're not showing search suggestions, the default search engine won't be visible // at the top of the table. Show it with the others in the bottom search bar. - if !(searchEngines?.shouldShowSearchSuggestions ?? false) { + if !(searchEnginesManager?.shouldShowSearchSuggestions ?? false) { engines?.insert(defaultEngine, at: 0) } return engines! } - var searchEngines: SearchEngines? { + var searchEnginesManager: SearchEnginesManager? { didSet { - guard let defaultEngine = searchEngines?.defaultEngine else { return } + guard let defaultEngine = searchEnginesManager?.defaultEngine else { return } suggestClient?.cancelPendingRequest() @@ -95,7 +95,7 @@ class SearchViewModel: FeatureFlaggable, LoaderListener { /// Whether to show suggestions from the search engine. var shouldShowSearchEngineSuggestions: Bool { - return searchEngines?.shouldShowSearchSuggestions ?? false + return searchEnginesManager?.shouldShowSearchSuggestions ?? false } var shouldShowSyncedTabsSuggestions: Bool { @@ -146,7 +146,7 @@ class SearchViewModel: FeatureFlaggable, LoaderListener { init(isPrivate: Bool, isBottomSearchBar: Bool, profile: Profile, - model: SearchEngines, + model: SearchEnginesManager, tabManager: TabManager, featureConfig: FeatureHolder = FxNimbus.shared.features.search, highlightManager: HistoryHighlightsManagerProtocol = HistoryHighlightsManager() diff --git a/firefox-ios/Client/Frontend/Browser/SearchEngines/DefaultSearchEngineProvider.swift b/firefox-ios/Client/Frontend/Browser/SearchEngines/DefaultSearchEngineProvider.swift index 8167f40ac776..273058fd5a51 100644 --- a/firefox-ios/Client/Frontend/Browser/SearchEngines/DefaultSearchEngineProvider.swift +++ b/firefox-ios/Client/Frontend/Browser/SearchEngines/DefaultSearchEngineProvider.swift @@ -35,7 +35,6 @@ class DefaultSearchEngineProvider: SearchEngineProvider { // might not work to change the default. guard let orderedEngineNames = orderedEngineNames else { // We haven't persisted the engine order, so return whatever order we got from disk. - DispatchQueue.main.async { completion(unorderedEngines) } @@ -83,13 +82,11 @@ class DefaultSearchEngineProvider: SearchEngineProvider { with: pluginDirectory.appendingPathComponent("list.json") ) else { logger.log("Failed to parse List.json", level: .fatal, category: .setup) - // swiftlint:disable line_length fatalError("We are unable to populate search engines for this locale because list.json could not be parsed.") - // swiftlint:enable line_length } - let possibilities = possibleLanguageIdentifier - let engineNames = defaultSearchPrefs.visibleDefaultEngines(for: possibilities, and: region) - let defaultEngineName = defaultSearchPrefs.searchDefault(for: possibilities, and: region) + + let engineNames = defaultSearchPrefs.visibleDefaultEngines(for: possibleLanguageIdentifier, and: region) + let defaultEngineName = defaultSearchPrefs.searchDefault(for: possibleLanguageIdentifier, and: region) guard !engineNames.isEmpty else { logger.log("No search engines.", level: .fatal, category: .setup) diff --git a/firefox-ios/Client/Frontend/Browser/SearchEngines/Redux/SearchEngineSelectionAction.swift b/firefox-ios/Client/Frontend/Browser/SearchEngines/Redux/SearchEngineSelectionAction.swift new file mode 100644 index 000000000000..81d20da4e620 --- /dev/null +++ b/firefox-ios/Client/Frontend/Browser/SearchEngines/Redux/SearchEngineSelectionAction.swift @@ -0,0 +1,24 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/ + +import Common +import Foundation +import MenuKit +import Redux + +final class SearchEngineSelectionAction: Action { + let searchEngines: [OpenSearchEngine]? + + init(windowUUID: WindowUUID, actionType: ActionType, searchEngines: [OpenSearchEngine]? = nil) { + self.searchEngines = searchEngines + super.init(windowUUID: windowUUID, actionType: actionType) + } +} + +enum SearchEngineSelectionActionType: ActionType { + case viewDidLoad + case didLoadSearchEngines +} + +enum SearchEngineSelectionMiddlewareActionType: ActionType {} diff --git a/firefox-ios/Client/Frontend/Browser/SearchEngines/Redux/SearchEngineSelectionMiddleware.swift b/firefox-ios/Client/Frontend/Browser/SearchEngines/Redux/SearchEngineSelectionMiddleware.swift new file mode 100644 index 000000000000..8a643ff57d96 --- /dev/null +++ b/firefox-ios/Client/Frontend/Browser/SearchEngines/Redux/SearchEngineSelectionMiddleware.swift @@ -0,0 +1,50 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/ + +import Common +import Redux +import ToolbarKit + +final class SearchEngineSelectionMiddleware { + private let profile: Profile + private let logger: Logger + private let searchEnginesManager: SearchEnginesManager + + init(profile: Profile = AppContainer.shared.resolve(), + searchEnginesManager: SearchEnginesManager? = nil, + logger: Logger = DefaultLogger.shared) { + self.profile = profile + self.logger = logger + self.searchEnginesManager = searchEnginesManager ?? SearchEnginesManager(prefs: profile.prefs, files: profile.files) + } + + lazy var searchEngineSelectionProvider: Middleware = { [self] state, action in + guard let action = action as? SearchEngineSelectionAction else { return } + + switch action.actionType { + case SearchEngineSelectionActionType.viewDidLoad: + guard let searchEngines = searchEnginesManager.orderedEngines, !searchEngines.isEmpty else { + // The SearchEngineManager should have loaded these by now, but if not, attempt to fetch the search engines + self.searchEnginesManager.getOrderedEngines { [weak self] searchEngines in + self?.notifyDidLoad(windowUUID: action.windowUUID, searchEngines: searchEngines) + } + return + } + + notifyDidLoad(windowUUID: action.windowUUID, searchEngines: searchEngines) + + default: + break + } + } + + private func notifyDidLoad(windowUUID: WindowUUID, searchEngines: [OpenSearchEngine]) { + let action = SearchEngineSelectionAction( + windowUUID: windowUUID, + actionType: SearchEngineSelectionActionType.didLoadSearchEngines, + searchEngines: searchEngines + ) + store.dispatch(action) + } +} diff --git a/firefox-ios/Client/Frontend/Browser/SearchEngines/Redux/SearchEngineSelectionState.swift b/firefox-ios/Client/Frontend/Browser/SearchEngines/Redux/SearchEngineSelectionState.swift new file mode 100644 index 000000000000..830797021c41 --- /dev/null +++ b/firefox-ios/Client/Frontend/Browser/SearchEngines/Redux/SearchEngineSelectionState.swift @@ -0,0 +1,75 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/ + +import Common +import Shared +import Redux + +struct SearchEngineSelectionState: ScreenState, Equatable { + var windowUUID: WindowUUID + var shouldDismiss: Bool + // Default search engine should appear in position 0 + var searchEngines: [OpenSearchEngine] + + init(appState: AppState, uuid: WindowUUID) { + guard let state = store.state.screenState( + SearchEngineSelectionState.self, + for: .searchEngineSelection, + window: uuid + ) else { + self.init(windowUUID: uuid) + return + } + + self.init( + windowUUID: state.windowUUID, + searchEngines: state.searchEngines, + shouldDismiss: state.shouldDismiss + ) + } + + init(windowUUID: WindowUUID) { + self.init(windowUUID: windowUUID, searchEngines: []) + } + + private init( + windowUUID: WindowUUID, + searchEngines: [OpenSearchEngine], + shouldDismiss: Bool = false + ) { + self.windowUUID = windowUUID + self.searchEngines = searchEngines + self.shouldDismiss = shouldDismiss + } + + /// Returns a new `SearchEngineSelectionState` which clears any transient data. + static func defaultState(fromPreviousState state: SearchEngineSelectionState) -> SearchEngineSelectionState { + return SearchEngineSelectionState( + windowUUID: state.windowUUID, + searchEngines: state.searchEngines + ) + } + + static let reducer: Reducer = { state, action in + // Only process actions for the current window + guard action.windowUUID == .unavailable || action.windowUUID == state.windowUUID else { + return defaultState(fromPreviousState: state) + } + + switch action.actionType { + case SearchEngineSelectionActionType.didLoadSearchEngines: + guard let action = action as? SearchEngineSelectionAction, + let searchEngines = action.searchEngines + else { return defaultState(fromPreviousState: state) } + + return SearchEngineSelectionState( + windowUUID: state.windowUUID, + searchEngines: searchEngines + ) + + default: + return defaultState(fromPreviousState: state) + } + } +} diff --git a/firefox-ios/Client/Frontend/Browser/SearchEngines/SearchEngines.swift b/firefox-ios/Client/Frontend/Browser/SearchEngines/SearchEnginesManager.swift similarity index 87% rename from firefox-ios/Client/Frontend/Browser/SearchEngines/SearchEngines.swift rename to firefox-ios/Client/Frontend/Browser/SearchEngines/SearchEnginesManager.swift index 835ad6d50688..fcc812f7d98d 100644 --- a/firefox-ios/Client/Frontend/Browser/SearchEngines/SearchEngines.swift +++ b/firefox-ios/Client/Frontend/Browser/SearchEngines/SearchEnginesManager.swift @@ -11,26 +11,26 @@ protocol SearchEngineDelegate: AnyObject { func searchEnginesDidUpdate() } -/// Manage a set of Open Search engines. +/// Manages a set of `OpenSearchEngine`s. /// -/// The search engines are ordered. +/// The search engines are ordered and can be enabled and disabled by the user. Order and disabled state are backed by a +/// write-through cache into a Prefs instance (i.e. UserDefaults). /// -/// Individual search engines can be enabled and disabled. +/// Default search engines are localized and given by the `SearchEngineProvider` (from list.json). The user may add +/// additional custom search engines. Custom search engines entered by the user are saved to a file. /// -/// The first search engine is distinguished and labeled the "default" search engine; it can never be -/// disabled. Search suggestions should always be sourced from the default search engine. -/// -/// Two additional bits of information are maintained: whether search suggestions are enabled and whether -/// search suggestions in private mode is disabled +/// The first search engine is distinguished and labeled the "default" search engine; it can never be disabled. +/// [FIXME FXIOS-10187 this will change soon ->] Search suggestions should always be sourced from the default search engine /// -/// Consumers will almost always use `defaultEngine` if they want a single search engine, and -/// `quickSearchEngines()` if they want a list of enabled quick search engines (possibly empty, -/// since the default engine is never included in the list of enabled quick search engines, and -/// it is possible to disable every non-default quick search engine). +/// Two additional bits of information are maintained: whether search suggestions are enabled and whether search suggestions +/// in private mode are disabled. /// -/// The search engines are backed by a write-through cache into a ProfilePrefs instance. This class -/// is not thread-safe -- you should only access it on a single thread (usually, the main thread)! -class SearchEngines { +/// Consumers will almost always use `defaultEngine` if they want a single search engine, and `quickSearchEngines()` if they +/// want a list of enabled quick search engines (possibly empty, since the default engine is never included in the list of +/// enabled quick search engines, and it is possible to disable every non-default quick search engine). +/// +/// This class is not thread-safe -- you should only access it on a single thread (usually, the main thread)! +class SearchEnginesManager { private let prefs: Prefs private let fileAccessor: FileAccessor private let orderedEngineNames = "search.orderedEngineNames" @@ -116,6 +116,9 @@ class SearchEngines { } } + /// The subset of search engines that are enabled and not the default search engine. + /// + /// The results can be empty if the user disables all search engines besides the default (which can't be disabled). var quickSearchEngines: [OpenSearchEngine]! { return self.orderedEngines.filter({ (engine) in !self.isEngineDefault(engine) && self.isEngineEnabled(engine) }) } @@ -302,20 +305,3 @@ class SearchEngines { } } } - -extension Locale { - func possibilitiesForLanguageIdentifier() -> [String] { - var possibilities: [String] = [] - let languageIdentifier = self.identifier - let components = languageIdentifier.components(separatedBy: "-") - possibilities.append(languageIdentifier) - - if components.count == 3, let first = components.first, let last = components.last { - possibilities.append("\(first)-\(last)") - } - if components.count >= 2, let first = components.first { - possibilities.append("\(first)") - } - return possibilities - } -} diff --git a/firefox-ios/Client/Frontend/Browser/SearchEngines/Views/SearchEngineSelectionViewController.swift b/firefox-ios/Client/Frontend/Browser/SearchEngines/Views/SearchEngineSelectionViewController.swift index 6742d1bb5478..d70de53bb42b 100644 --- a/firefox-ios/Client/Frontend/Browser/SearchEngines/Views/SearchEngineSelectionViewController.swift +++ b/firefox-ios/Client/Frontend/Browser/SearchEngines/Views/SearchEngineSelectionViewController.swift @@ -11,7 +11,8 @@ import Redux class SearchEngineSelectionViewController: UIViewController, UISheetPresentationControllerDelegate, UIPopoverPresentationControllerDelegate, - Themeable { + Themeable, + StoreSubscriber { // MARK: - Properties var notificationCenter: NotificationProtocol var themeManager: ThemeManager @@ -20,6 +21,7 @@ class SearchEngineSelectionViewController: UIViewController, weak var coordinator: SearchEngineSelectionCoordinator? private let windowUUID: WindowUUID + private var state: SearchEngineSelectionState private let logger: Logger // MARK: - UI/UX elements @@ -32,6 +34,15 @@ class SearchEngineSelectionViewController: UIViewController, view.addTarget(self, action: #selector(self.didTapOpenSettings), for: .touchUpInside) } + // FIXME FXIOS-10189 This will be deleted later. + private lazy var placeholderSwitchSearchEngineButton: UIButton = .build { view in + view.setTitle("Test changing search engine", for: .normal) + view.setTitleColor(.systemPink, for: .normal) + view.titleLabel?.numberOfLines = 0 + view.titleLabel?.textAlignment = .center + + view.addTarget(self, action: #selector(self.testDidChangeSearchEngine), for: .touchUpInside) + } // MARK: - Initializers and Lifecycle @@ -42,11 +53,15 @@ class SearchEngineSelectionViewController: UIViewController, logger: Logger = DefaultLogger.shared ) { self.windowUUID = windowUUID + self.state = SearchEngineSelectionState(windowUUID: windowUUID) + self.logger = logger self.notificationCenter = notificationCenter self.themeManager = themeManager - self.logger = logger + super.init(nibName: nil, bundle: nil) + subscribeToRedux() + // TODO Additional setup to come // ... } @@ -55,6 +70,10 @@ class SearchEngineSelectionViewController: UIViewController, fatalError("init(coder:) has not been implemented") } + deinit { + unsubscribeFromRedux() + } + override func viewDidLoad() { super.viewDidLoad() @@ -63,6 +82,13 @@ class SearchEngineSelectionViewController: UIViewController, setupView() listenForThemeChange(view) + + store.dispatch( + SearchEngineSelectionAction( + windowUUID: self.windowUUID, + actionType: SearchEngineSelectionActionType.viewDidLoad + ) + ) } override func viewWillAppear(_ animated: Bool) { @@ -75,14 +101,54 @@ class SearchEngineSelectionViewController: UIViewController, private func setupView() { view.addSubview(placeholderOpenSettingsButton) + view.addSubviews(placeholderSwitchSearchEngineButton) NSLayoutConstraint.activate([ placeholderOpenSettingsButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 80), placeholderOpenSettingsButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), - placeholderOpenSettingsButton.widthAnchor.constraint(equalToConstant: 200) + placeholderOpenSettingsButton.widthAnchor.constraint(equalToConstant: 200), + + placeholderSwitchSearchEngineButton.topAnchor.constraint(equalTo: placeholderOpenSettingsButton.bottomAnchor), + placeholderSwitchSearchEngineButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), ]) } + // MARK: - Redux + + func subscribeToRedux() { + store.dispatch( + ScreenAction( + windowUUID: windowUUID, + actionType: ScreenActionType.showScreen, + screen: .searchEngineSelection + ) + ) + + let uuid = windowUUID + store.subscribe(self, transform: { + return $0.select({ appState in + return SearchEngineSelectionState(appState: appState, uuid: uuid) + }) + }) + } + + func unsubscribeFromRedux() { + store.dispatch( + ScreenAction( + windowUUID: windowUUID, + actionType: ScreenActionType.closeScreen, + screen: .searchEngineSelection + ) + ) + } + + func newState(state: SearchEngineSelectionState) { + self.state = state + + // FIXME FXIOS-10189 Eventually we'll have a tableview. Placeholder for temporary testing redux. + placeholderSwitchSearchEngineButton.setTitle(state.searchEngines.last?.shortName ?? "Empty!", for: .normal) + } + // MARK: - Theme func applyTheme() { @@ -103,4 +169,11 @@ class SearchEngineSelectionViewController: UIViewController, func didTapOpenSettings(sender: UIButton) { coordinator?.navigateToSearchSettings(animated: true) } + + // FIXME FXIOS-10189 This will be deleted later. + @objc + func testDidChangeSearchEngine(sender: UIButton) { + // TODO FXIOS-10384 Push action to the toolbar to update the search engine selection for the next search and + // to focus the toolbar (if it isn't already focused). + } } diff --git a/firefox-ios/Client/Frontend/Browser/Toolbars/AddressToolbarContainer.swift b/firefox-ios/Client/Frontend/Browser/Toolbars/AddressToolbarContainer.swift index 85d81210dbe0..66c35ed83668 100644 --- a/firefox-ios/Client/Frontend/Browser/Toolbars/AddressToolbarContainer.swift +++ b/firefox-ios/Client/Frontend/Browser/Toolbars/AddressToolbarContainer.swift @@ -26,12 +26,10 @@ final class AddressToolbarContainer: UIView, AlphaDimmable, StoreSubscriber, AddressToolbarDelegate, - MenuHelperURLBarInterface, Autocompletable, URLBarViewProtocol { private enum UX { - static let compactLeadingEdgeEditing: CGFloat = 8 - static let compactHorizontalEdge: CGFloat = 16 + static let toolbarHorizontalPadding: CGFloat = 16 } typealias SubscriberStateType = ToolbarState @@ -67,20 +65,9 @@ final class AddressToolbarContainer: UIView, private var progressBarTopConstraint: NSLayoutConstraint? private var progressBarBottomConstraint: NSLayoutConstraint? - private func calculateToolbarSpace(isLeading: Bool) -> CGFloat? { - guard let toolbarState = store.state.screenState(ToolbarState.self, - for: .toolbar, - window: windowUUID) - else { return nil } - - let isCompact = shouldDisplayCompact - let isEditing = toolbarState.addressToolbar.isEditing - - if isCompact && isEditing { - return isLeading ? UX.compactLeadingEdgeEditing : -UX.compactHorizontalEdge - } - - return nil + private func calculateToolbarSpace() -> CGFloat { + // Provide 0 padding in iPhone landscape due to safe area insets + return shouldDisplayCompact || UIDevice.current.userInterfaceIdiom == .pad ? UX.toolbarHorizontalPadding : 0 } /// Overlay mode is the state where the lock/reader icons are hidden, the home panels are shown, @@ -182,13 +169,13 @@ final class AddressToolbarContainer: UIView, updateProgressBarPosition(toolbarState.toolbarPosition) compactToolbar.configure(state: newModel.addressToolbarState, toolbarDelegate: self, - leadingSpace: calculateToolbarSpace(isLeading: true), - trailingSpace: calculateToolbarSpace(isLeading: false), + leadingSpace: calculateToolbarSpace(), + trailingSpace: calculateToolbarSpace(), isUnifiedSearchEnabled: isUnifiedSearchEnabled) regularToolbar.configure(state: newModel.addressToolbarState, toolbarDelegate: self, - leadingSpace: calculateToolbarSpace(isLeading: true), - trailingSpace: calculateToolbarSpace(isLeading: false), + leadingSpace: calculateToolbarSpace(), + trailingSpace: calculateToolbarSpace(), isUnifiedSearchEnabled: isUnifiedSearchEnabled) // the layout (compact/regular) that should be displayed is driven by the state @@ -350,20 +337,6 @@ final class AddressToolbarContainer: UIView, delegate?.searchSuggestions(searchTerm: "") } - // MARK: - MenuHelperURLBarInterface - override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { - if action == MenuHelperURLBarModel.selectorPasteAndGo { - return UIPasteboard.general.hasStrings - } - - return super.canPerformAction(action, withSender: sender) - } - - func menuHelperPasteAndGo() { - guard let pasteboardContents = UIPasteboard.general.string else { return } - delegate?.openBrowser(searchTerm: pasteboardContents) - } - // MARK: - Autocompletable func setAutocompleteSuggestion(_ suggestion: String?) { toolbar.setAutocompleteSuggestion(suggestion) diff --git a/firefox-ios/Client/Frontend/Browser/Toolbars/Models/AddressToolbarContainerModel.swift b/firefox-ios/Client/Frontend/Browser/Toolbars/Models/AddressToolbarContainerModel.swift index b9785bdadf12..b6327ace6c81 100644 --- a/firefox-ios/Client/Frontend/Browser/Toolbars/Models/AddressToolbarContainerModel.swift +++ b/firefox-ios/Client/Frontend/Browser/Toolbars/Models/AddressToolbarContainerModel.swift @@ -14,7 +14,7 @@ class AddressToolbarContainerModel: Equatable { let borderPosition: AddressToolbarBorderPosition? let searchEngineName: String? let searchEngineImage: UIImage? - let searchEngines: SearchEngines + let searchEnginesManager: SearchEnginesManager let lockIconImageName: String? let safeListedURLImageName: String? let url: URL? @@ -30,7 +30,7 @@ class AddressToolbarContainerModel: Equatable { let windowUUID: UUID var addressToolbarState: AddressToolbarState { - let term = searchTerm ?? searchTermFromURL(url, searchEngines: searchEngines) + let term = searchTerm ?? searchTermFromURL(url, searchEnginesManager: searchEnginesManager) var droppableUrl: URL? if let url, !InternalURL.isValid(url: url) { @@ -92,9 +92,9 @@ class AddressToolbarContainerModel: Equatable { isShowingTopTabs: state.isShowingTopTabs, windowUUID: windowUUID) self.windowUUID = windowUUID - self.searchEngineName = profile.searchEngines.defaultEngine?.shortName - self.searchEngineImage = profile.searchEngines.defaultEngine?.image - self.searchEngines = profile.searchEngines + self.searchEngineName = profile.searchEnginesManager.defaultEngine?.shortName + self.searchEngineImage = profile.searchEnginesManager.defaultEngine?.image + self.searchEnginesManager = profile.searchEnginesManager self.lockIconImageName = state.addressToolbar.lockIconImageName self.safeListedURLImageName = state.addressToolbar.safeListedURLImageName self.url = state.addressToolbar.url @@ -108,14 +108,14 @@ class AddressToolbarContainerModel: Equatable { self.canShowNavigationHint = state.canShowNavigationHint } - func searchTermFromURL(_ url: URL?, searchEngines: SearchEngines) -> String? { + func searchTermFromURL(_ url: URL?, searchEnginesManager: SearchEnginesManager) -> String? { var searchURL: URL? = url if let url = searchURL, InternalURL.isValid(url: url) { searchURL = url } - guard let query = searchEngines.queryForSearchURL(searchURL) else { return nil } + guard let query = searchEnginesManager.queryForSearchURL(searchURL) else { return nil } return query } diff --git a/firefox-ios/Client/Frontend/Fakespot/Views/FakespotMessageCardView.swift b/firefox-ios/Client/Frontend/Fakespot/Views/FakespotMessageCardView.swift index 472ccca71499..49028f55f969 100644 --- a/firefox-ios/Client/Frontend/Fakespot/Views/FakespotMessageCardView.swift +++ b/firefox-ios/Client/Frontend/Fakespot/Views/FakespotMessageCardView.swift @@ -31,22 +31,22 @@ class FakespotMessageCardViewModel: ObservableObject { func primaryButtonBackground(theme: Theme) -> UIColor { switch self { - case .confirmation: return theme.colors.actionConfirmation + case .confirmation: return theme.colors.actionSuccess case .warning: return theme.colors.actionWarning - case .info: return theme.colors.actionInfo + case .info: return theme.colors.actionInformation case .infoLoading: return theme.colors.actionSecondary - case .error: return theme.colors.actionError + case .error: return theme.colors.actionCritical case .infoTransparent: return theme.colors.actionSecondary } } func cardBackground(theme: Theme) -> UIColor { switch self { - case .confirmation: return theme.colors.layerConfirmation + case .confirmation: return theme.colors.layerSuccess case .warning: return theme.colors.layerWarning - case .info: return theme.colors.layerInfo + case .info: return theme.colors.layerInformation case .infoLoading: return .clear - case .error: return theme.colors.layerError + case .error: return theme.colors.layerCritical case .infoTransparent: return .clear } } diff --git a/firefox-ios/Client/Frontend/Home/TopSites/Cell/TopSiteItemCell.swift b/firefox-ios/Client/Frontend/Home/TopSites/Cell/TopSiteItemCell.swift index 234b343e50d4..32513f57b859 100644 --- a/firefox-ios/Client/Frontend/Home/TopSites/Cell/TopSiteItemCell.swift +++ b/firefox-ios/Client/Frontend/Home/TopSites/Cell/TopSiteItemCell.swift @@ -268,6 +268,7 @@ extension TopSiteItemCell: ThemeApplicable { extension TopSiteItemCell: Blurrable { func adjustBlur(theme: Theme) { if shouldApplyWallpaperBlur { + rootContainer.layoutIfNeeded() rootContainer.addBlurEffectWithClearBackgroundAndClipping(using: .systemThickMaterial) } else { // If blur is disabled set background color diff --git a/firefox-ios/Client/Frontend/Home/TopSites/DataManagement/TopSitesDataAdaptor.swift b/firefox-ios/Client/Frontend/Home/TopSites/DataManagement/TopSitesDataAdaptor.swift index 42a503b233bc..04c7c52e6007 100644 --- a/firefox-ios/Client/Frontend/Home/TopSites/DataManagement/TopSitesDataAdaptor.swift +++ b/firefox-ios/Client/Frontend/Home/TopSites/DataManagement/TopSitesDataAdaptor.swift @@ -173,7 +173,7 @@ class TopSitesDataAdaptorImplementation: TopSitesDataAdaptor, FeatureFlaggable { if sponsoredTileSpaces > 0 { sites.addSponsoredTiles(sponsoredTileSpaces: sponsoredTileSpaces, contiles: contiles, - defaultSearchEngine: profile.searchEngines.defaultEngine) + defaultSearchEngine: profile.searchEnginesManager.defaultEngine) } } diff --git a/firefox-ios/Client/Frontend/Library/Bookmarks/Legacy/BookmarksFolderCell.swift b/firefox-ios/Client/Frontend/Library/Bookmarks/Legacy/BookmarksFolderCell.swift index 798de85d9e7b..3fb3bedd76e6 100644 --- a/firefox-ios/Client/Frontend/Library/Bookmarks/Legacy/BookmarksFolderCell.swift +++ b/firefox-ios/Client/Frontend/Library/Bookmarks/Legacy/BookmarksFolderCell.swift @@ -80,7 +80,7 @@ extension BookmarkItemData: BookmarksFolderCell { // (e.g., "http://foo.com/bar/?query=%s"), and this will get them the same behavior as if // they'd copied and pasted into the URL bar. // See BrowserViewController.urlBar:didSubmitText:. - guard let url = URIFixup.getURL(url) ?? profile.searchEngines.defaultEngine?.searchURLForQuery(url) else { + guard let url = URIFixup.getURL(url) ?? profile.searchEnginesManager.defaultEngine?.searchURLForQuery(url) else { logger.log("Invalid URL, and couldn't generate a search URL for it.", level: .warning, category: .library) diff --git a/firefox-ios/Client/Frontend/Library/Bookmarks/Legacy/LegacyBookmarkDetailPanel.swift b/firefox-ios/Client/Frontend/Library/Bookmarks/Legacy/LegacyBookmarkDetailPanel.swift index 4a27bdb95743..f2e112076894 100644 --- a/firefox-ios/Client/Frontend/Library/Bookmarks/Legacy/LegacyBookmarkDetailPanel.swift +++ b/firefox-ios/Client/Frontend/Library/Bookmarks/Legacy/LegacyBookmarkDetailPanel.swift @@ -247,7 +247,7 @@ class LegacyBookmarkDetailPanel: SiteTableViewController { deleteBookmarkButton.titleLabel?.font = FXFontStyles.Regular.body.scaledFont() deleteBookmarkButton.backgroundColor = currentTheme().colors.layer5 deleteBookmarkButton.setTitle(.Bookmarks.Menu.DeleteBookmark, for: .normal) - deleteBookmarkButton.setTitleColor(currentTheme().colors.textWarning, for: .normal) + deleteBookmarkButton.setTitleColor(currentTheme().colors.textCritical, for: .normal) } override func reloadData() { diff --git a/firefox-ios/Client/Frontend/Library/Reader/ReaderPanel.swift b/firefox-ios/Client/Frontend/Library/Reader/ReaderPanel.swift index 1149358ef46f..3683f6816854 100644 --- a/firefox-ios/Client/Frontend/Library/Reader/ReaderPanel.swift +++ b/firefox-ios/Client/Frontend/Library/Reader/ReaderPanel.swift @@ -120,7 +120,7 @@ class ReadingListTableViewCell: UITableViewCell, ThemeApplicable { selectedBackgroundView?.backgroundColor = theme.colors.layer5Hover titleLabel.textColor = unread ? theme.colors.textPrimary : theme.colors.textDisabled hostnameLabel.textColor = unread ? theme.colors.textPrimary : theme.colors.textDisabled - readStatusImageView.tintColor = theme.colors.iconAction + readStatusImageView.tintColor = theme.colors.iconAccent } required init?(coder aDecoder: NSCoder) { diff --git a/firefox-ios/Client/Frontend/PasswordManagement/BreachAlertsDetailView.swift b/firefox-ios/Client/Frontend/PasswordManagement/BreachAlertsDetailView.swift index a9c19ae43e33..05b3ea6447a3 100644 --- a/firefox-ios/Client/Frontend/PasswordManagement/BreachAlertsDetailView.swift +++ b/firefox-ios/Client/Frontend/PasswordManagement/BreachAlertsDetailView.swift @@ -218,18 +218,18 @@ class BreachAlertsDetailView: UIView, ThemeApplicable { let colors = theme.colors layer.shadowColor = colors.shadowDefault.cgColor backgroundColor = colors.layer2 - titleIcon.tintColor = colors.iconWarning - titleLabel.textColor = colors.textWarning - breachDateLabel.textColor = colors.textWarning - descriptionLabel.textColor = colors.textWarning + titleIcon.tintColor = colors.iconCritical + titleLabel.textColor = colors.textCritical + breachDateLabel.textColor = colors.textCritical + descriptionLabel.textColor = colors.textCritical goToLabel.attributedText = getAttributedText( for: breachLink, - with: colors.textWarning + with: colors.textCritical ) learnMoreButton.setAttributedTitle( getAttributedText( for: .BreachAlertsLearnMore, - with: colors.textWarning + with: colors.textCritical ), for: .normal ) diff --git a/firefox-ios/Client/Frontend/PasswordManagement/Cells/PasswordManagerTableViewCell.swift b/firefox-ios/Client/Frontend/PasswordManagement/Cells/PasswordManagerTableViewCell.swift index 47cba0bacafe..bd93dc27475a 100644 --- a/firefox-ios/Client/Frontend/PasswordManagement/Cells/PasswordManagerTableViewCell.swift +++ b/firefox-ios/Client/Frontend/PasswordManagement/Cells/PasswordManagerTableViewCell.swift @@ -120,6 +120,6 @@ class PasswordManagerTableViewCell: ThemedTableViewCell { super.applyTheme(theme: theme) hostnameLabel.textColor = theme.colors.textPrimary usernameLabel.textColor = theme.colors.textSecondary - breachAlertImageView.tintColor = theme.colors.iconWarning + breachAlertImageView.tintColor = theme.colors.iconCritical } } diff --git a/firefox-ios/Client/Frontend/PasswordManagement/PasswordManagerListViewController.swift b/firefox-ios/Client/Frontend/PasswordManagement/PasswordManagerListViewController.swift index f0cd216d0735..2feaf39b4928 100644 --- a/firefox-ios/Client/Frontend/PasswordManagement/PasswordManagerListViewController.swift +++ b/firefox-ios/Client/Frontend/PasswordManagement/PasswordManagerListViewController.swift @@ -146,7 +146,7 @@ class PasswordManagerListViewController: SensitiveViewController, Themeable { selectionButton.setTitleColor(theme.colors.textInverted, for: []) selectionButton.backgroundColor = theme.colors.actionPrimary - deleteButton.tintColor = theme.colors.textWarning + deleteButton.tintColor = theme.colors.textCritical // Search bar text and placeholder color let searchTextField = searchController.searchBar.searchTextField diff --git a/firefox-ios/Client/Frontend/Settings/ClearPrivateDataTableViewController.swift b/firefox-ios/Client/Frontend/Settings/ClearPrivateDataTableViewController.swift index 27f58c5d7cf6..5bd1719b3354 100644 --- a/firefox-ios/Client/Frontend/Settings/ClearPrivateDataTableViewController.swift +++ b/firefox-ios/Client/Frontend/Settings/ClearPrivateDataTableViewController.swift @@ -56,7 +56,7 @@ class ClearPrivateDataTableViewController: ThemedTableViewController { private var clearButtonEnabled = true { didSet { - let textWarningColor = currentTheme().colors.textWarning + let textWarningColor = currentTheme().colors.textCritical let textDisabledColor = currentTheme().colors.textDisabled clearButton?.textLabel?.textColor = clearButtonEnabled ? textWarningColor : textDisabledColor } diff --git a/firefox-ios/Client/Frontend/Settings/CustomSearchViewController.swift b/firefox-ios/Client/Frontend/Settings/CustomSearchViewController.swift index 61d43d02b32d..7dbb18c6ad6a 100644 --- a/firefox-ios/Client/Frontend/Settings/CustomSearchViewController.swift +++ b/firefox-ios/Client/Frontend/Settings/CustomSearchViewController.swift @@ -69,7 +69,7 @@ class CustomSearchViewController: SettingsTableViewController { do { let engine = try await createEngine(query: trimmedQuery, name: trimmedTitle) self.spinnerView.stopAnimating() - self.profile.searchEngines.addSearchEngine(engine) + self.profile.searchEnginesManager.addSearchEngine(engine) CATransaction.begin() // Use transaction to call callback after animation has been completed CATransaction.setCompletionBlock(self.successCallback) @@ -124,7 +124,7 @@ class CustomSearchViewController: SettingsTableViewController { } private func engineExists(name: String, template: String) -> Bool { - return profile.searchEngines.orderedEngines.contains { (engine) -> Bool in + return profile.searchEnginesManager.orderedEngines.contains { (engine) -> Bool in return engine.shortName == name || engine.searchTemplate == template } } @@ -309,7 +309,7 @@ class CustomSearchEngineTextView: Setting, UITextViewDelegate { func textViewDidChange(_ textView: UITextView) { placeholderLabel.isHidden = !textField.text.isEmpty settingDidChange?(textView.text) - let color = isValid(textField.text) ? theme.colors.textPrimary : theme.colors.textWarning + let color = isValid(textField.text) ? theme.colors.textPrimary : theme.colors.textCritical textField.textColor = color } diff --git a/firefox-ios/Client/Frontend/Settings/Main/Account/AccountStatusSetting.swift b/firefox-ios/Client/Frontend/Settings/Main/Account/AccountStatusSetting.swift index d8393c3b92fa..b47272342e2f 100644 --- a/firefox-ios/Client/Frontend/Settings/Main/Account/AccountStatusSetting.swift +++ b/firefox-ios/Client/Frontend/Settings/Main/Account/AccountStatusSetting.swift @@ -56,7 +56,7 @@ class AccountStatusSetting: WithAccountSetting { override var status: NSAttributedString? { if RustFirefoxAccounts.shared.isActionNeeded { let string: String = .FxAAccountVerifyPassword - let color = theme.colors.textWarning + let color = theme.colors.textCritical let range = NSRange(location: 0, length: string.count) let attrs = [NSAttributedString.Key.foregroundColor: color] let res = NSMutableAttributedString(string: string) diff --git a/firefox-ios/Client/Frontend/Settings/Main/Account/SyncNowSetting.swift b/firefox-ios/Client/Frontend/Settings/Main/Account/SyncNowSetting.swift index 4951024676f9..3546c6aa01ab 100644 --- a/firefox-ios/Client/Frontend/Settings/Main/Account/SyncNowSetting.swift +++ b/firefox-ios/Client/Frontend/Settings/Main/Account/SyncNowSetting.swift @@ -48,7 +48,7 @@ class SyncNowSetting: WithAccountSetting { return NSAttributedString( string: .FxANoInternetConnection, attributes: [ - NSAttributedString.Key.foregroundColor: theme.colors.textWarning, + NSAttributedString.Key.foregroundColor: theme.colors.textCritical, NSAttributedString.Key.font: FXFontStyles.Regular.body.scaledFont() ] ) @@ -87,7 +87,7 @@ class SyncNowSetting: WithAccountSetting { switch syncStatus { case .inProgress: - return syncIcon?.tinted(withColor: theme.colors.iconAction) + return syncIcon?.tinted(withColor: theme.colors.iconAccent) default: return syncIcon?.tinted(withColor: theme.colors.iconPrimary) } @@ -106,7 +106,7 @@ class SyncNowSetting: WithAccountSetting { return NSAttributedString( string: message, attributes: [ - NSAttributedString.Key.foregroundColor: theme.colors.textWarning, + NSAttributedString.Key.foregroundColor: theme.colors.textCritical, NSAttributedString.Key.font: FXFontStyles.Regular.body.scaledFont() ] ) @@ -153,7 +153,7 @@ class SyncNowSetting: WithAccountSetting { guard let self = self else { return } troubleshootButton.setTitle(.FirefoxSyncTroubleshootTitle, for: .normal) troubleshootButton.addTarget(self, action: #selector(self.troubleshoot), for: .touchUpInside) - troubleshootButton.setTitleColor(self.theme.colors.textWarning, for: .normal) + troubleshootButton.setTitleColor(self.theme.colors.textCritical, for: .normal) troubleshootButton.titleLabel?.font = FXFontStyles.Regular.caption1.scaledFont() } @@ -166,13 +166,13 @@ class SyncNowSetting: WithAccountSetting { private lazy var warningIcon: UIImageView = { let image = UIImage(named: StandardImageIdentifiers.Large.warningFill)? - .tinted(withColor: theme.colors.iconWarning) + .tinted(withColor: theme.colors.iconCritical) return UIImageView(image: image) }() private lazy var errorIcon: UIImageView = { let image = UIImage.templateImageNamed(StandardImageIdentifiers.Large.warningFill)? - .tinted(withColor: theme.colors.iconWarning) + .tinted(withColor: theme.colors.iconCritical) return UIImageView(image: image) }() diff --git a/firefox-ios/Client/Frontend/Settings/Main/General/SearchSetting.swift b/firefox-ios/Client/Frontend/Settings/Main/General/SearchSetting.swift index 2c3bc5f39434..108f71df6b2a 100644 --- a/firefox-ios/Client/Frontend/Settings/Main/General/SearchSetting.swift +++ b/firefox-ios/Client/Frontend/Settings/Main/General/SearchSetting.swift @@ -16,7 +16,7 @@ class SearchSetting: Setting { override var status: NSAttributedString { return NSAttributedString( - string: profile.searchEngines.defaultEngine?.shortName ?? "" + string: profile.searchEnginesManager.defaultEngine?.shortName ?? "" ) } diff --git a/firefox-ios/Client/Frontend/Settings/SearchSettingsTableViewController.swift b/firefox-ios/Client/Frontend/Settings/SearchSettingsTableViewController.swift index d575361f8ffa..073d85bb2fc6 100644 --- a/firefox-ios/Client/Frontend/Settings/SearchSettingsTableViewController.swift +++ b/firefox-ios/Client/Frontend/Settings/SearchSettingsTableViewController.swift @@ -40,7 +40,7 @@ final class SearchSettingsTableViewController: ThemedTableViewController, Featur } private let profile: Profile - private let model: SearchEngines + private let model: SearchEnginesManager var shouldHidePrivateModeFirefoxSuggestSetting: Bool { return !model.shouldShowBookmarksSuggestions && @@ -82,7 +82,7 @@ final class SearchSettingsTableViewController: ThemedTableViewController, Featur init(profile: Profile, windowUUID: WindowUUID) { self.profile = profile - model = profile.searchEngines + model = profile.searchEnginesManager super.init(windowUUID: windowUUID) } diff --git a/firefox-ios/Client/Frontend/Settings/SettingsContentViewController.swift b/firefox-ios/Client/Frontend/Settings/SettingsContentViewController.swift index 10a838d07f39..61e3b04b8838 100644 --- a/firefox-ios/Client/Frontend/Settings/SettingsContentViewController.swift +++ b/firefox-ios/Client/Frontend/Settings/SettingsContentViewController.swift @@ -172,7 +172,7 @@ class SettingsContentViewController: UIViewController, WKNavigationDelegate, The let error: UILabel = .build { label in if self.settingsTitle != nil { label.text = .SettingsContentPageLoadError - label.textColor = self.currentTheme().colors.textWarning + label.textColor = self.currentTheme().colors.textCritical label.textAlignment = .center } label.isHidden = true diff --git a/firefox-ios/Client/Frontend/Settings/SettingsTableViewController.swift b/firefox-ios/Client/Frontend/Settings/SettingsTableViewController.swift index a29a627d97ac..cae70f73d2fd 100644 --- a/firefox-ios/Client/Frontend/Settings/SettingsTableViewController.swift +++ b/firefox-ios/Client/Frontend/Settings/SettingsTableViewController.swift @@ -632,7 +632,7 @@ class StringSetting: Setting, UITextFieldDelegate { @objc func textFieldDidChange(_ textField: UITextField) { - let color = isValid(textField.text) ? theme.colors.textPrimary : theme.colors.textWarning + let color = isValid(textField.text) ? theme.colors.textPrimary : theme.colors.textCritical textField.textColor = color } @@ -794,7 +794,7 @@ class ButtonSetting: Setting { super.onConfigureCell(cell, theme: theme) if isEnabled?() ?? true { - cell.textLabel?.textColor = destructive ? theme.colors.textWarning : theme.colors.actionPrimary + cell.textLabel?.textColor = destructive ? theme.colors.textCritical : theme.colors.actionPrimary } else { cell.textLabel?.textColor = theme.colors.textDisabled } diff --git a/firefox-ios/Client/Frontend/Theme/ThemedTableViewCells/ThemedCenteredTableViewCell.swift b/firefox-ios/Client/Frontend/Theme/ThemedTableViewCells/ThemedCenteredTableViewCell.swift index 31e8ee2f3499..cb9a3bcd3070 100644 --- a/firefox-ios/Client/Frontend/Theme/ThemedTableViewCells/ThemedCenteredTableViewCell.swift +++ b/firefox-ios/Client/Frontend/Theme/ThemedTableViewCells/ThemedCenteredTableViewCell.swift @@ -62,6 +62,6 @@ class ThemedCenteredTableViewCell: ThemedTableViewCell { override func applyTheme(theme: Theme) { super.applyTheme(theme: theme) - centeredLabel.textColor = theme.colors.textWarning + centeredLabel.textColor = theme.colors.textCritical } } diff --git a/firefox-ios/Client/Frontend/Theme/ThemedTableViewCells/ThemedTableViewCellViewModel.swift b/firefox-ios/Client/Frontend/Theme/ThemedTableViewCells/ThemedTableViewCellViewModel.swift index fb047d382cb6..23d2b05967d6 100644 --- a/firefox-ios/Client/Frontend/Theme/ThemedTableViewCells/ThemedTableViewCellViewModel.swift +++ b/firefox-ios/Client/Frontend/Theme/ThemedTableViewCells/ThemedTableViewCellViewModel.swift @@ -34,7 +34,7 @@ class ThemedTableViewCellViewModel { case .actionPrimary: textColor = theme.colors.actionPrimary case .destructive: - textColor = theme.colors.textWarning + textColor = theme.colors.textCritical case .disabled: textColor = theme.colors.textDisabled } diff --git a/firefox-ios/Client/Frontend/Toolbar+URLBar/ReaderModeButton.swift b/firefox-ios/Client/Frontend/Toolbar+URLBar/ReaderModeButton.swift index 7ceadf630ba5..8256b19b319d 100644 --- a/firefox-ios/Client/Frontend/Toolbar+URLBar/ReaderModeButton.swift +++ b/firefox-ios/Client/Frontend/Toolbar+URLBar/ReaderModeButton.swift @@ -70,7 +70,7 @@ class ReaderModeButton: UIButton { extension ReaderModeButton: ThemeApplicable { func applyTheme(theme: Theme) { - selectedTintColor = theme.colors.iconAction + selectedTintColor = theme.colors.iconAccent unselectedTintColor = theme.colors.iconSecondary tintColor = isSelected ? selectedTintColor : unselectedTintColor } diff --git a/firefox-ios/Client/Frontend/Toolbar+URLBar/URLBarView.swift b/firefox-ios/Client/Frontend/Toolbar+URLBar/URLBarView.swift index f5db4e4875b1..c7da00bc4097 100644 --- a/firefox-ios/Client/Frontend/Toolbar+URLBar/URLBarView.swift +++ b/firefox-ios/Client/Frontend/Toolbar+URLBar/URLBarView.swift @@ -89,7 +89,7 @@ class URLBarView: UIView, } var parent: UIStackView? - var searchEngines: SearchEngines? + var searchEnginesManager: SearchEnginesManager? weak var delegate: URLBarDelegate? weak var tabToolbarDelegate: TabToolbarDelegate? var helper: TabToolbarHelper? @@ -245,7 +245,7 @@ class URLBarView: UIView, init(profile: Profile, windowUUID: WindowUUID) { self.profile = profile self.windowUUID = windowUUID - self.searchEngines = SearchEngines(prefs: profile.prefs, files: profile.files) + self.searchEnginesManager = SearchEnginesManager(prefs: profile.prefs, files: profile.files) super.init(frame: CGRect()) commonInit() } @@ -255,7 +255,7 @@ class URLBarView: UIView, } func searchEnginesDidUpdate() { - let engineID = profile.searchEngines.defaultEngine?.engineID ?? "custom" + let engineID = profile.searchEnginesManager.defaultEngine?.engineID ?? "custom" TelemetryWrapper.recordEvent( category: .information, method: .change, @@ -264,8 +264,8 @@ class URLBarView: UIView, extras: [TelemetryWrapper.EventExtraKey.recordSearchEngineID.rawValue: engineID] ) - self.searchIconImageView.image = profile.searchEngines.defaultEngine?.image - self.searchIconImageView.largeContentTitle = profile.searchEngines.defaultEngine?.shortName + self.searchIconImageView.image = profile.searchEnginesManager.defaultEngine?.image + self.searchIconImageView.largeContentTitle = profile.searchEnginesManager.defaultEngine?.shortName self.searchIconImageView.largeContentImage = nil } @@ -291,7 +291,7 @@ class URLBarView: UIView, addSubview($0) } - profile.searchEngines.delegate = self + profile.searchEnginesManager.delegate = self privateModeBadge.add(toParent: self) warningMenuBadge.add(toParent: self) diff --git a/firefox-ios/Client/Frontend/Widgets/SiteTableViewController.swift b/firefox-ios/Client/Frontend/Widgets/SiteTableViewController.swift index 63c4392289e5..e1ec5ba2caa1 100644 --- a/firefox-ios/Client/Frontend/Widgets/SiteTableViewController.swift +++ b/firefox-ios/Client/Frontend/Widgets/SiteTableViewController.swift @@ -186,7 +186,7 @@ class SiteTableViewController: UIViewController, func applyTheme() { let theme = themeManager.getCurrentTheme(for: windowUUID) navigationController?.navigationBar.barTintColor = theme.colors.layer1 - navigationController?.navigationBar.tintColor = theme.colors.iconAction + navigationController?.navigationBar.tintColor = theme.colors.iconAccent navigationController?.navigationBar.titleTextAttributes = [ .foregroundColor: theme.colors.textPrimary ] diff --git a/firefox-ios/Client/Frontend/Widgets/SiteTableViewHeader.swift b/firefox-ios/Client/Frontend/Widgets/SiteTableViewHeader.swift index d9806f334e34..c18d7782013a 100644 --- a/firefox-ios/Client/Frontend/Widgets/SiteTableViewHeader.swift +++ b/firefox-ios/Client/Frontend/Widgets/SiteTableViewHeader.swift @@ -101,7 +101,7 @@ class SiteTableViewHeader: UITableViewHeaderFooterView, ThemeApplicable, Reusabl func applyTheme(theme: Theme) { titleLabel.textColor = theme.colors.textPrimary backgroundView?.backgroundColor = theme.colors.layer1 - collapsibleImageView.image = collapsibleState?.image?.tinted(withColor: theme.colors.iconAction) + collapsibleImageView.image = collapsibleState?.image?.tinted(withColor: theme.colors.iconAccent) bordersHelper.applyTheme(theme: theme) } diff --git a/firefox-ios/Client/Redux/GlobalState/ActiveScreenAction.swift b/firefox-ios/Client/Redux/GlobalState/ActiveScreenAction.swift index 58af1862ce86..db238c023a3b 100644 --- a/firefox-ios/Client/Redux/GlobalState/ActiveScreenAction.swift +++ b/firefox-ios/Client/Redux/GlobalState/ActiveScreenAction.swift @@ -32,6 +32,7 @@ enum AppScreen { case microsurvey case trackingProtection case toolbar + case searchEngineSelection case passwordGenerator } diff --git a/firefox-ios/Client/Redux/GlobalState/ActiveScreenState.swift b/firefox-ios/Client/Redux/GlobalState/ActiveScreenState.swift index 54f6b19ec416..e3d39b9d8a9e 100644 --- a/firefox-ios/Client/Redux/GlobalState/ActiveScreenState.swift +++ b/firefox-ios/Client/Redux/GlobalState/ActiveScreenState.swift @@ -21,6 +21,7 @@ enum AppScreenState: Equatable { case themeSettings(ThemeSettingsState) case trackingProtection(TrackingProtectionState) case toolbar(ToolbarState) + case searchEngineSelection(SearchEngineSelectionState) case passwordGenerator(PasswordGeneratorState) static let reducer: Reducer = { state, action in @@ -51,6 +52,8 @@ enum AppScreenState: Equatable { return .trackingProtection(TrackingProtectionState.reducer(state, action)) case .toolbar(let state): return .toolbar(ToolbarState.reducer(state, action)) + case .searchEngineSelection(let state): + return .searchEngineSelection(SearchEngineSelectionState.reducer(state, action)) case .passwordGenerator(let state): return .passwordGenerator(PasswordGeneratorState.reducer(state, action)) } @@ -72,6 +75,7 @@ enum AppScreenState: Equatable { case .themeSettings: return .themeSettings case .trackingProtection: return .trackingProtection case .toolbar: return .toolbar + case .searchEngineSelection: return .searchEngineSelection case .passwordGenerator: return .passwordGenerator } } @@ -91,6 +95,7 @@ enum AppScreenState: Equatable { case .themeSettings(let state): return state.windowUUID case .trackingProtection(let state): return state.windowUUID case .toolbar(let state): return state.windowUUID + case .searchEngineSelection(let state): return state.windowUUID case .passwordGenerator(let state): return state.windowUUID } } @@ -156,6 +161,8 @@ struct ActiveScreensState: Equatable { screens.append(.trackingProtection(TrackingProtectionState(windowUUID: uuid))) case .toolbar: screens.append(.toolbar(ToolbarState(windowUUID: uuid))) + case .searchEngineSelection: + screens.append(.searchEngineSelection(SearchEngineSelectionState(windowUUID: uuid))) case .passwordGenerator: screens.append(.passwordGenerator(PasswordGeneratorState(windowUUID: uuid))) } diff --git a/firefox-ios/Client/Redux/GlobalState/AppState.swift b/firefox-ios/Client/Redux/GlobalState/AppState.swift index 099f77ea9fa9..af6b75f943e4 100644 --- a/firefox-ios/Client/Redux/GlobalState/AppState.swift +++ b/firefox-ios/Client/Redux/GlobalState/AppState.swift @@ -30,6 +30,7 @@ struct AppState: StateType { case (.tabsTray(let state), .tabsTray): return state as? S case (.themeSettings(let state), .themeSettings): return state as? S case (.toolbar(let state), .toolbar): return state as? S + case (.searchEngineSelection(let state), .searchEngineSelection): return state as? S case (.trackingProtection(let state), .trackingProtection): return state as? S case (.passwordGenerator(let state), .passwordGenerator): return state as? S default: return nil @@ -63,6 +64,7 @@ let middlewares = [ TabManagerMiddleware().tabsPanelProvider, ThemeManagerMiddleware().themeManagerProvider, ToolbarMiddleware().toolbarProvider, + SearchEngineSelectionMiddleware().searchEngineSelectionProvider, TrackingProtectionMiddleware().trackingProtectionProvider, PasswordGeneratorMiddleware().passwordGeneratorProvider, PocketMiddleware().pocketSectionProvider diff --git a/firefox-ios/Client/Telemetry/TelemetryWrapper.swift b/firefox-ios/Client/Telemetry/TelemetryWrapper.swift index 704301020de1..fd0f9efd877d 100644 --- a/firefox-ios/Client/Telemetry/TelemetryWrapper.swift +++ b/firefox-ios/Client/Telemetry/TelemetryWrapper.swift @@ -96,7 +96,7 @@ class TelemetryWrapper: TelemetryWrapperProtocol, FeatureFlaggable { // If there's no default search engine, (there's not, at this point), we will // send "unavailable" in order not to send `null`, but still differentiate // the event in the startup sequence. - let defaultEngine = profile.searchEngines.defaultEngine + let defaultEngine = profile.searchEnginesManager.defaultEngine GleanMetrics.Search.defaultEngine.set(defaultEngine?.engineID ?? "unavailable") // Get the legacy telemetry ID and record it in Glean for the deletion-request ping @@ -161,7 +161,7 @@ class TelemetryWrapper: TelemetryWrapperProtocol, FeatureFlaggable { } // Record default search engine setting - let defaultEngine = profile.searchEngines.defaultEngine + let defaultEngine = profile.searchEnginesManager.defaultEngine GleanMetrics.Search.defaultEngine.set(defaultEngine?.engineID ?? "custom") // Record the open tab count diff --git a/firefox-ios/Extensions/ShareTo/ShareViewController.swift b/firefox-ios/Extensions/ShareTo/ShareViewController.swift index d6a50d18525e..20e6d8f3ffb8 100644 --- a/firefox-ios/Extensions/ShareTo/ShareViewController.swift +++ b/firefox-ios/Extensions/ShareTo/ShareViewController.swift @@ -360,7 +360,7 @@ class ShareViewController: UIViewController { let stackView = UIStackView() stackView.axis = .horizontal stackView.translatesAutoresizingMaskIntoConstraints = false - stackView.addBackground(color: theme.colors.iconAction) + stackView.addBackground(color: theme.colors.iconAccent) stackView.rightLeftEdges(inset: UX.rowInset) parent.addArrangedSubview(stackView) stackView.heightAnchor.constraint(equalToConstant: CGFloat(UX.pageInfoRowHeight)).isActive = true diff --git a/firefox-ios/Providers/Profile.swift b/firefox-ios/Providers/Profile.swift index d52dac7abd4d..069f351a9043 100644 --- a/firefox-ios/Providers/Profile.swift +++ b/firefox-ios/Providers/Profile.swift @@ -88,7 +88,7 @@ protocol Profile: AnyObject { var prefs: Prefs { get } var queue: TabQueue { get } #if !MOZ_TARGET_NOTIFICATIONSERVICE && !MOZ_TARGET_SHARETO && !MOZ_TARGET_CREDENTIAL_PROVIDER - var searchEngines: SearchEngines { get } + var searchEnginesManager: SearchEnginesManager { get } #endif var files: FileAccessor { get } var pinnedSites: PinnedSites { get } @@ -470,8 +470,8 @@ open class BrowserProfile: Profile { lazy var autofill = RustAutofill(databasePath: autofillDbPath) #if !MOZ_TARGET_NOTIFICATIONSERVICE && !MOZ_TARGET_SHARETO && !MOZ_TARGET_CREDENTIAL_PROVIDER - lazy var searchEngines: SearchEngines = { - return SearchEngines(prefs: self.prefs, files: self.files) + lazy var searchEnginesManager: SearchEnginesManager = { + return SearchEnginesManager(prefs: self.prefs, files: self.files) }() #endif diff --git a/firefox-ios/Shared/Supporting Files/cs.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/cs.lproj/AddressToolbar.strings index 812b8beea43d..3d275bc2bc32 100644 --- a/firefox-ios/Shared/Supporting Files/cs.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/cs.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Nastavení soukromí a bezpečnosti"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Otevře výběr vyhledávače"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Vyhledávací modul: %@"; diff --git a/firefox-ios/Shared/Supporting Files/cs.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/cs.lproj/FxANotification.strings new file mode 100644 index 000000000000..7570ef70451e --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/cs.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ zavřel panely: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Zobrazení nedávno zavřených panelů"; + diff --git a/firefox-ios/Shared/Supporting Files/cs.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/cs.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..27ec7eae1372 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/cs.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Zavřít"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Otevře nastavení vyhledávání"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Nastavení vyhledávání"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Tentokrát hledat v:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Nastavení vyhledávání"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Tentokrát hledat v:"; + diff --git a/firefox-ios/Shared/Supporting Files/cy.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/cy.lproj/AddressToolbar.strings index a3da6456e64b..ecdcb59daa12 100644 --- a/firefox-ios/Shared/Supporting Files/cy.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/cy.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Gosodiadau Preifatrwydd a Diogelwch"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Yn agor y dewis o beiriannau chwilio"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Peiriant Chwilio: %@"; diff --git a/firefox-ios/Shared/Supporting Files/cy.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/cy.lproj/FxANotification.strings new file mode 100644 index 000000000000..11c795daf157 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/cy.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ tab wedi'u cau: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Gweld tabiau a gaewyd yn ddiweddar"; + diff --git a/firefox-ios/Shared/Supporting Files/cy.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/cy.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..05f05c007f06 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/cy.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Cau"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Yn agor gosodiadau chwilio"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Gosodiadau chwilio"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Y tro hwn chwilio yn:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Gosodiadau Chwilio"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Y tro hwn chwilio yn:"; + diff --git a/firefox-ios/Shared/Supporting Files/da.lproj/Shopping.strings b/firefox-ios/Shared/Supporting Files/da.lproj/Shopping.strings index 78e58f0da9e6..9909dc4e5aa3 100644 --- a/firefox-ios/Shared/Supporting Files/da.lproj/Shopping.strings +++ b/firefox-ios/Shared/Supporting Files/da.lproj/Shopping.strings @@ -176,10 +176,10 @@ "Shopping.ReviewQualityCard.AdjustedRating.Label.v120" = "Den *justerede bedømmelse* er udelukkende baseret på anmeldelser, som vi vurderer er pålidelige."; /* Accessibility label for the up chevron, from 'How we determine review quality' card displayed in the shopping review quality bottom sheet. */ -"Shopping.ReviewQualityCard.Collapse.AccessibilityLabel.v120" = "Skjul kortet \"Sådan afgør vi kvaliteten af anmeldelser\""; +"Shopping.ReviewQualityCard.Collapse.AccessibilityLabel.v120" = "Sammenfold kortet \"Sådan afgør vi kvaliteten af anmeldelser\""; /* Accessibility label for the down chevron, from 'How we determine review quality' card displayed in the shopping review quality bottom sheet. */ -"Shopping.ReviewQualityCard.Expand.AccessibilityLabel.v120" = "Vis kortet \"Sådan afgør vi kvaliteten af anmeldelser\""; +"Shopping.ReviewQualityCard.Expand.AccessibilityLabel.v120" = "Udvid kortet \"Sådan afgør vi kvaliteten af anmeldelser\""; /* Label of the headline from How we determine review quality card displayed in the shopping review quality bottom sheet. The first parameter will be replaced by the Fakespot app name and the second parameter by the company name of Mozilla. */ "Shopping.ReviewQualityCard.Headline.Label.v120" = "Vi bruger kunstig intelligens fra %1$@ fra %2$@ til at kontrollere pålideligheden af produktanmeldelser. Dette hjælper dig kun med at bedømme kvaliteten af anmeldelserne, ikke selve produkternes kvalitet."; @@ -209,10 +209,10 @@ "Shopping.ReviewQualityCard.UnreliableReviews.Label.v120" = "Upålidelige anmeldelser. Vi vurderer, at anmeldelserne sandsynligvis er forfalskede eller stammer fra partiske anmeldere."; /* Accessibility label for the up chevron icon used to collapse or minimize the Settings Card within the shopping product review bottom sheet. */ -"Shopping.SettingsCard.Collapse.AccessibilityLabel.v120" = "Skjul kortet \"Indstillinger\""; +"Shopping.SettingsCard.Collapse.AccessibilityLabel.v120" = "Sammenfold kortet \"Indstillinger\""; /* Accessibility label for the down chevron icon used to expand or show the details of the Settings Card within the shopping product review bottom sheet. */ -"Shopping.SettingsCard.Expand.AccessibilityLabel.v120" = "Vis kortet \"Indstillinger\""; +"Shopping.SettingsCard.Expand.AccessibilityLabel.v120" = "Udvid kortet \"Indstillinger\""; /* Accessibility hint for the recommended products label and switch, grouped together. When the group is selected in VoiceOver mode, the hint is read to help the user understand what action can be performed. */ "Shopping.SettingsCard.Expand.GroupedRecommendedProductsAndSwitch.AccessibilityHint.v123" = "Dobbelt-tryk for at slå indstilling til/fra."; diff --git a/firefox-ios/Shared/Supporting Files/de.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/de.lproj/AddressToolbar.strings index 1b34e8aa8ceb..a3710e48cba5 100644 --- a/firefox-ios/Shared/Supporting Files/de.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/de.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Datenschutz- und Sicherheitseinstellungen"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Öffnet Suchmaschinen-Auswahl"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Suchmaschine: %@"; diff --git a/firefox-ios/Shared/Supporting Files/de.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/de.lproj/FxANotification.strings new file mode 100644 index 000000000000..a2232ad7814d --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/de.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@-Tabs geschlossen: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Kürzlich geschlossene Tabs anzeigen"; + diff --git a/firefox-ios/Shared/Supporting Files/de.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/de.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..800f835b05b7 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/de.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Schließen"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Öffnet die Sucheinstellungen"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Sucheinstellungen"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Dieses Mal suchen in:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Sucheinstellungen"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Dieses Mal suchen in:"; + diff --git a/firefox-ios/Shared/Supporting Files/dsb.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/dsb.lproj/AddressToolbar.strings index 3d8393cd2c83..1a4091b777f7 100644 --- a/firefox-ios/Shared/Supporting Files/dsb.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/dsb.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Nastajenja priwatnosći a wěstoty"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Wócynja wuběrk pytnicow"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Pytnica: %@"; diff --git a/firefox-ios/Shared/Supporting Files/dsb.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/dsb.lproj/FxANotification.strings new file mode 100644 index 000000000000..1fdcff5735a1 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/dsb.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "Rejtariki %1$@ zacynjone: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Rowno zacynjone rejtariki pokazaś"; + diff --git a/firefox-ios/Shared/Supporting Files/dsb.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/dsb.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..7fbd4c5d835b --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/dsb.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Zacyniś"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Wócynja pytańske nastajenja"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Pytańske nastajenja"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Tenraz pytaś w:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Pytańske nastajenja"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Tenraz pytaś w:"; + diff --git a/firefox-ios/Shared/Supporting Files/el.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/el.lproj/AddressToolbar.strings index e2cf7e7e2c45..e93dac76dd04 100644 --- a/firefox-ios/Shared/Supporting Files/el.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/el.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Ρυθμίσεις απορρήτου και ασφαλείας"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Ανοίγει την επιλογή μηχανής αναζήτησης"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Μηχανή αναζήτησης: %@"; diff --git a/firefox-ios/Shared/Supporting Files/el.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/el.lproj/FxANotification.strings new file mode 100644 index 000000000000..549ee591aa08 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/el.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "Έκλεισαν %2$@ καρτέλες του %1$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Προβολή πρόσφατα κλεισμένων καρτελών"; + diff --git a/firefox-ios/Shared/Supporting Files/el.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/el.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..f2b109429776 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/el.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Κλείσιμο"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Ανοίγει τις ρυθμίσεις αναζήτησης"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Ρυθμίσεις αναζήτησης"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Αυτήν τη φορά, αναζήτηση σε:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Ρυθμίσεις αναζήτησης"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Αυτήν τη φορά, αναζήτηση σε:"; + diff --git a/firefox-ios/Shared/Supporting Files/en-GB.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/en-GB.lproj/AddressToolbar.strings index 3f0bfc1d3966..0aa18a9a2cb0 100644 --- a/firefox-ios/Shared/Supporting Files/en-GB.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/en-GB.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Privacy & Security Settings"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Opens search engine selection"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Search Engine: %@"; diff --git a/firefox-ios/Shared/Supporting Files/en-GB.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/en-GB.lproj/FxANotification.strings new file mode 100644 index 000000000000..b791cb5f4679 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/en-GB.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ tabs closed: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "View recently closed tabs"; + diff --git a/firefox-ios/Shared/Supporting Files/en-GB.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/en-GB.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..fffa50c68cc8 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/en-GB.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Close"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Opens search settings"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Search settings"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "This time search in:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Search Settings"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "This time search in:"; + diff --git a/firefox-ios/Shared/Supporting Files/en-US.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/en-US.lproj/AddressToolbar.strings index 3f0bfc1d3966..0aa18a9a2cb0 100644 --- a/firefox-ios/Shared/Supporting Files/en-US.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/en-US.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Privacy & Security Settings"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Opens search engine selection"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Search Engine: %@"; diff --git a/firefox-ios/Shared/Supporting Files/en-US.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/en-US.lproj/FxANotification.strings new file mode 100644 index 000000000000..b791cb5f4679 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/en-US.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ tabs closed: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "View recently closed tabs"; + diff --git a/firefox-ios/Shared/Supporting Files/en-US.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/en-US.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..fffa50c68cc8 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/en-US.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Close"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Opens search settings"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Search settings"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "This time search in:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Search Settings"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "This time search in:"; + diff --git a/firefox-ios/Shared/Supporting Files/es-AR.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/es-AR.lproj/AddressToolbar.strings index 6351c75b7a99..12258c5e835d 100644 --- a/firefox-ios/Shared/Supporting Files/es-AR.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/es-AR.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Configuración de privacidad y seguridad"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Abre la selección del buscador"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Buscador: %@"; diff --git a/firefox-ios/Shared/Supporting Files/es-AR.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/es-AR.lproj/FxANotification.strings new file mode 100644 index 000000000000..130bb32e4a25 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/es-AR.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "Pestañas cerradas en %1$@: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Ver pestañas cerradas recientemente"; + diff --git a/firefox-ios/Shared/Supporting Files/es-AR.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/es-AR.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..6512bcbceb43 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/es-AR.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Cerrar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Abre la configuración de búsqueda"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Configuración de búsqueda"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Esta vez, buscar en:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Configuración de búsqueda"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Esta vez, buscar en:"; + diff --git a/firefox-ios/Shared/Supporting Files/es-CL.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/es-CL.lproj/AddressToolbar.strings index 0a9b8ac2106a..1c78a1425811 100644 --- a/firefox-ios/Shared/Supporting Files/es-CL.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/es-CL.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Ajustes de privacidad y seguridad"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Abre la selección del motor de búsqueda"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Motor de búsqueda: %@"; diff --git a/firefox-ios/Shared/Supporting Files/es-CL.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/es-CL.lproj/FxANotification.strings new file mode 100644 index 000000000000..3aeb3a72e6ec --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/es-CL.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ pestañas cerradas: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Ver pestañas cerradas recientemente"; + diff --git a/firefox-ios/Shared/Supporting Files/es-CL.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/es-CL.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..a63f2989ea69 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/es-CL.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Cerrar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Abre los ajustes de búsqueda"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Ajustes de búsqueda"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Esta vez buscar en:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Ajustes de búsqueda"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Esta vez buscar en:"; + diff --git a/firefox-ios/Shared/Supporting Files/es.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/es.lproj/AddressToolbar.strings index ef1f901e240a..df46b20e5d36 100644 --- a/firefox-ios/Shared/Supporting Files/es.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/es.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Ajustes de Privacidad & Seguridad"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Abre la selección del buscador"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Buscador: %@"; diff --git a/firefox-ios/Shared/Supporting Files/es.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/es.lproj/FxANotification.strings new file mode 100644 index 000000000000..3aeb3a72e6ec --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/es.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ pestañas cerradas: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Ver pestañas cerradas recientemente"; + diff --git a/firefox-ios/Shared/Supporting Files/es.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/es.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..12765827d82e --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/es.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Cerrar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Abre los ajustes de búsqueda"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Configuración de búsquedas"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Esta vez buscar en:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Ajustes de búsqueda"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Esta vez buscar en:"; + diff --git a/firefox-ios/Shared/Supporting Files/eu.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/eu.lproj/AddressToolbar.strings index 6983f4bd071b..47572ad0924f 100644 --- a/firefox-ios/Shared/Supporting Files/eu.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/eu.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Pribatutasun- eta segurtasun-ezarpenak"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Bilaketa-motorraren hautapena irekitzen du"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Bilaketa-motorra: %@"; diff --git a/firefox-ios/Shared/Supporting Files/eu.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/eu.lproj/FxANotification.strings new file mode 100644 index 000000000000..cf8dcac732f0 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/eu.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ fitxa itxita: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Ikusi itxitako azken fitxak"; + diff --git a/firefox-ios/Shared/Supporting Files/eu.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/eu.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..57c002c3bde3 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/eu.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Itxi"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Ireki bilaketa-ezarpenak"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Bilaketa-ezarpenak"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Oraingoan, bilatu honekin:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Bilaketa-ezarpenak"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Oraingoan, bilatu honekin:"; + diff --git a/firefox-ios/Shared/Supporting Files/fi.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/fi.lproj/AddressToolbar.strings index 21413bd60151..3ab4a806e5f7 100644 --- a/firefox-ios/Shared/Supporting Files/fi.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/fi.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Tietosuoja- ja turvallisuusasetukset"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Avaa hakukoneen valinnan"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Hakukone: %@"; diff --git a/firefox-ios/Shared/Supporting Files/fi.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/fi.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..574d2c5a70bf --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/fi.lproj/SearchEngineSelection.strings @@ -0,0 +1,6 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Sulje"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Avaa hakuasetukset"; + diff --git a/firefox-ios/Shared/Supporting Files/fr.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/fr.lproj/AddressToolbar.strings index 92d5636a698a..117340727deb 100644 --- a/firefox-ios/Shared/Supporting Files/fr.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/fr.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Paramètres de vie privée et de sécurité"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Ouvre la sélection du moteur de recherche"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Moteur de recherche : %@"; diff --git a/firefox-ios/Shared/Supporting Files/fr.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/fr.lproj/FxANotification.strings new file mode 100644 index 000000000000..49441deedada --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/fr.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "Onglets %1$@ fermés : %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Afficher les onglets récemment fermés"; + diff --git a/firefox-ios/Shared/Supporting Files/fr.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/fr.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..eab3b4f49c65 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/fr.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Fermer"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Ouvre les paramètres de recherche"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Paramètres de recherche"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Pour cette recherche :"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Paramètres de recherche"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Pour cette recherche :"; + diff --git a/firefox-ios/Shared/Supporting Files/gd.lproj/EnhancedTrackingProtection.strings b/firefox-ios/Shared/Supporting Files/gd.lproj/EnhancedTrackingProtection.strings index 2b639eff01e8..44c81444a7a6 100644 --- a/firefox-ios/Shared/Supporting Files/gd.lproj/EnhancedTrackingProtection.strings +++ b/firefox-ios/Shared/Supporting Files/gd.lproj/EnhancedTrackingProtection.strings @@ -62,7 +62,7 @@ "Menu.EnhancedTrackingProtection.Details.Trackers.CrossSite.v129" = "Briosgaidean tracaidh thar làraichean: %@"; /* Text to let users know how many fingerprinters were blocked on the current website. The placeholder will show the number of fingerprinters detected */ -"Menu.EnhancedTrackingProtection.Details.Trackers.Fingerprinter.v129" = "Lorgaichean-meur: %@"; +"Menu.EnhancedTrackingProtection.Details.Trackers.Fingerprinter.v129" = "Lorgairean-meòir: %@"; /* Text to let users know how many social media trackers were blocked on the current website. The placeholder will show the number of such cookies detected */ "Menu.EnhancedTrackingProtection.Details.Trackers.SocialMedia.v129" = "Tracaichean nam meadhanan sòisealta: %@"; diff --git a/firefox-ios/Shared/Supporting Files/he.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/he.lproj/AddressToolbar.strings index b8dc1a7b5075..69aa59fb2831 100644 --- a/firefox-ios/Shared/Supporting Files/he.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/he.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "הגדרות פרטיות ואבטחה"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "פותח את תפריט בחירת מנוע החיפוש"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "מנוע חיפוש: %@"; diff --git a/firefox-ios/Shared/Supporting Files/he.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/he.lproj/FxANotification.strings new file mode 100644 index 000000000000..126db4927068 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/he.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%2$@ לשוניות נסגרו מ־%1$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "הצגת לשוניות שנסגרו לאחרונה"; + diff --git a/firefox-ios/Shared/Supporting Files/he.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/he.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..77edb16b06e2 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/he.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "סגירה"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "פותח את הגדרות החיפוש"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "הגדרות חיפוש"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "הפעם לחפש ב:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "הגדרות חיפוש"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "הפעם לחפש ב:"; + diff --git a/firefox-ios/Shared/Supporting Files/hsb.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/hsb.lproj/AddressToolbar.strings index 174b3ceeef64..f975e6308395 100644 --- a/firefox-ios/Shared/Supporting Files/hsb.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/hsb.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Nastajenja priwatnosće a wěstoty"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Wočinja wuběr pytawow"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Pytawa: %@"; diff --git a/firefox-ios/Shared/Supporting Files/hsb.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/hsb.lproj/FxANotification.strings new file mode 100644 index 000000000000..6f8fa49fe3f1 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/hsb.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "Rajtarki %1$@ začinjene: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Runje začinjene rajtarki pokazać"; + diff --git a/firefox-ios/Shared/Supporting Files/hsb.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/hsb.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..edfd000baaaa --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/hsb.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Začinić"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Wočinja pytanske nastajenja"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Pytanske nastajenja"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Tónkróć pytać w:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Pytanske nastajenja"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Tónkróć pytać w:"; + diff --git a/firefox-ios/Shared/Supporting Files/hy-AM.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/hy-AM.lproj/AddressToolbar.strings index b898fe3fee46..71d771e8e89d 100644 --- a/firefox-ios/Shared/Supporting Files/hy-AM.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/hy-AM.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Գաղտնիության և անվտանգության հավելումներ"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Բացում է որոնիչի ընտրությունը"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Որոնիչ՝ %@"; diff --git a/firefox-ios/Shared/Supporting Files/hy-AM.lproj/Bookmarks.strings b/firefox-ios/Shared/Supporting Files/hy-AM.lproj/Bookmarks.strings index af7f20bbf440..d14c415ebafb 100644 --- a/firefox-ios/Shared/Supporting Files/hy-AM.lproj/Bookmarks.strings +++ b/firefox-ios/Shared/Supporting Files/hy-AM.lproj/Bookmarks.strings @@ -4,6 +4,9 @@ /* Name of the top level bookmarks folder present in the folder selection menu of the`Edit Bookmark` screen */ "Bookmarks.Menu.BookmarksTopLevelTitle.v131" = "Էջանիշեր"; +/* The title for the Delete Bookmark button, in the Edit Bookmark popup screen which is summoned from the main menu's Save submenu, which will delete the currently bookmarked site from the user's bookmarks. */ +"Bookmarks.Menu.DeleteBookmark.v132" = "Ջնջել էջանիշը"; + /* Label of toast displayed after a bookmark is deleted in the Bookmarks menu. %@ is the name of the bookmark. */ "Bookmarks.Menu.DeletedBookmark.v131" = "“%@”-ը ջնջվել է"; diff --git a/firefox-ios/Shared/Supporting Files/hy-AM.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/hy-AM.lproj/FxANotification.strings new file mode 100644 index 000000000000..50452266ce0e --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/hy-AM.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@-ի փակած ներդիրները՝ %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Դիտել վերջերս փակված ներդիրները"; + diff --git a/firefox-ios/Shared/Supporting Files/hy-AM.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/hy-AM.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..2bd172630c1e --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/hy-AM.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Փակել"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Բացել որոնման կարգավորումները"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Որոնման կարգավորումներ"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Այս անգամվա որոնեք՝"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Որոնման կարգավորումներ"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Այս անգամվա որոնեք՝"; + diff --git a/firefox-ios/Shared/Supporting Files/ia.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/ia.lproj/AddressToolbar.strings index 6ff29c5c7bf4..8de9fe427534 100644 --- a/firefox-ios/Shared/Supporting Files/ia.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/ia.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Parametros de securitate e confidentialitate"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Aperi le selection del motor de recerca"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Motor de recerca: %@"; diff --git a/firefox-ios/Shared/Supporting Files/ia.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/ia.lproj/FxANotification.strings new file mode 100644 index 000000000000..eec420fe9359 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/ia.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ schedas claudite: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Vider schedas recentemente claudite"; + diff --git a/firefox-ios/Shared/Supporting Files/ia.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/ia.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..fe040ad831de --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/ia.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Clauder"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Aperi le parametros de recerca"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Parametros de recerca"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Iste vice cercar in:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Parametros de recerca"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Iste vice cercar in:"; + diff --git a/firefox-ios/Shared/Supporting Files/is.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/is.lproj/AddressToolbar.strings index fb06bd4a1d9e..d56acd5795a8 100644 --- a/firefox-ios/Shared/Supporting Files/is.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/is.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Persónuverndar- og öryggisstillingar"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Opnar val á leitarvél"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Leitarvél: %@"; diff --git a/firefox-ios/Shared/Supporting Files/is.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/is.lproj/FxANotification.strings new file mode 100644 index 000000000000..3ed4e738a553 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/is.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ flipum lokað: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Skoða nýlega lokaða flipa"; + diff --git a/firefox-ios/Shared/Supporting Files/is.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/is.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..e635fe3b7bc1 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/is.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Loka"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Opnar leitarstillingar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Leitarstillingar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Leita núna í:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Leitarstillingar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Leita núna í:"; + diff --git a/firefox-ios/Shared/Supporting Files/it.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/it.lproj/AddressToolbar.strings index 1cdd620ca8da..46d9efd8cbcc 100644 --- a/firefox-ios/Shared/Supporting Files/it.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/it.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Impostazioni per privacy e sicurezza"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Apre la selezione del motore di ricerca"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Motore di ricerca: %@"; diff --git a/firefox-ios/Shared/Supporting Files/it.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/it.lproj/FxANotification.strings new file mode 100644 index 000000000000..0678543bcba5 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/it.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "Schede di %1$@ chiuse: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Visualizza schede chiuse di recente"; + diff --git a/firefox-ios/Shared/Supporting Files/it.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/it.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..89560addee44 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/it.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Chiudi"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Apre le impostazioni di ricerca"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Impostazioni ricerca"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Questa volta cerca in:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Impostazioni ricerca"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Questa volta cerca in:"; + diff --git a/firefox-ios/Shared/Supporting Files/kab.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/kab.lproj/AddressToolbar.strings index 00300481f852..ae775a1252fb 100644 --- a/firefox-ios/Shared/Supporting Files/kab.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/kab.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Iɣewwaren n tbaḍnit d tɣellist"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Yettalday tafrant n umsedday n unadi"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Amsedday n unadi: %@"; diff --git a/firefox-ios/Shared/Supporting Files/kab.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/kab.lproj/FxANotification.strings new file mode 100644 index 000000000000..42c81971bd92 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/kab.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ accaren yettwamedlen: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Wali accareni yettwamedlen melmi kan"; + diff --git a/firefox-ios/Shared/Supporting Files/kab.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/kab.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..a08226f7e6b7 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/kab.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Mdel"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Yettalday iɣewwaren n unadi"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Nadi ismenyifen"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "I unadi-a:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Iɣewwaren n unadi"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "I unadi-a:"; + diff --git a/firefox-ios/Shared/Supporting Files/kk.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/kk.lproj/AddressToolbar.strings index db99b47f992c..7136ffa12ecc 100644 --- a/firefox-ios/Shared/Supporting Files/kk.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/kk.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Жекелік және қауіпсіздік баптаулары"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Іздеу жүйесін таңдауды ашады"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Іздеу жүйесі: %@"; diff --git a/firefox-ios/Shared/Supporting Files/kk.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/kk.lproj/FxANotification.strings new file mode 100644 index 000000000000..c1e139c4c039 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/kk.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ бет жабылды: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Жақында жабылған беттерді қарау"; + diff --git a/firefox-ios/Shared/Supporting Files/kk.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/kk.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..e764c5184fa5 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/kk.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Жабу"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Іздеу баптауларын ашады"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Іздеу баптаулары"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Бұл жолы келесі жерде іздеу:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Іздеу баптаулары"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Бұл жолы келесі жерде іздеу:"; + diff --git a/firefox-ios/Shared/Supporting Files/ko.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/ko.lproj/AddressToolbar.strings index 6590222470cc..c78fcc413de8 100644 --- a/firefox-ios/Shared/Supporting Files/ko.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/ko.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "개인 정보 및 보안 설정"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "검색 엔진 선택 열기"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "검색 엔진: %@"; diff --git a/firefox-ios/Shared/Supporting Files/ko.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/ko.lproj/FxANotification.strings new file mode 100644 index 000000000000..cde08db2a3f5 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/ko.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ 탭 닫힘: %2$@개"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "최근에 닫은 탭 보기"; + diff --git a/firefox-ios/Shared/Supporting Files/ko.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/ko.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..929a474946d5 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/ko.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "닫기"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "검색 설정 열기"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "검색 설정"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "이번만 검색:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "검색 설정"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "이번만 검색:"; + diff --git a/firefox-ios/Shared/Supporting Files/lo.lproj/Bookmarks.strings b/firefox-ios/Shared/Supporting Files/lo.lproj/Bookmarks.strings index 6c7b4742d0a7..00fcb7148688 100644 --- a/firefox-ios/Shared/Supporting Files/lo.lproj/Bookmarks.strings +++ b/firefox-ios/Shared/Supporting Files/lo.lproj/Bookmarks.strings @@ -4,6 +4,9 @@ /* Name of the top level bookmarks folder present in the folder selection menu of the`Edit Bookmark` screen */ "Bookmarks.Menu.BookmarksTopLevelTitle.v131" = "ບຸກມາກ"; +/* The title for the Delete Bookmark button, in the Edit Bookmark popup screen which is summoned from the main menu's Save submenu, which will delete the currently bookmarked site from the user's bookmarks. */ +"Bookmarks.Menu.DeleteBookmark.v132" = "ລຶບບຸກມາກອອກ"; + /* Label of toast displayed after a bookmark is deleted in the Bookmarks menu. %@ is the name of the bookmark. */ "Bookmarks.Menu.DeletedBookmark.v131" = "ລຶບ “%@” ແລ້ວ"; diff --git a/firefox-ios/Shared/Supporting Files/lo.lproj/LoginsHelper.strings b/firefox-ios/Shared/Supporting Files/lo.lproj/LoginsHelper.strings index c80f75e2baba..0542731065ab 100644 --- a/firefox-ios/Shared/Supporting Files/lo.lproj/LoginsHelper.strings +++ b/firefox-ios/Shared/Supporting Files/lo.lproj/LoginsHelper.strings @@ -1,3 +1,9 @@ +/* Button to not save the user's password in the logins helper */ +"LoginsHelper.DontSave.Button.v122" = "ບໍ່ແມ່ນຕອນນີ້"; + +/* Button to not update the user's password in the logins helper */ +"LoginsHelper.DontUpdate.Button.v122" = "ບໍ່ແມ່ນຕອນນີ້"; + /* Button to save the user's password */ "LoginsHelper.SaveLogin.Button.v122" = "ບັນທຶກ"; diff --git a/firefox-ios/Shared/Supporting Files/lo.lproj/MainMenu.strings b/firefox-ios/Shared/Supporting Files/lo.lproj/MainMenu.strings new file mode 100644 index 000000000000..666eeb706842 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/lo.lproj/MainMenu.strings @@ -0,0 +1,12 @@ +/* The accessibility label for the back button in the Main menu header navigation view. */ +"MainMenu.Account.AccessibilityLabels.BackButton.v132" = "ກັບຄືນ"; + +/* The accessibility label for the close button in the Main menu. */ +"MainMenu.Account.AccessibilityLabels.CloseButton.v132" = "ປິດ"; + +/* On the main menu, the title for the action that will take the user to a website to get help from Mozilla. */ +"MainMenu.SettingsSection.GetHelp.Title.v131" = "ຂໍຄວາມຊ່ວຍເຫລືອ"; + +/* On the main menu, the title for the action that will take the user to the Settings menu. */ +"MainMenu.SettingsSection.Settings.Title.v131" = "ການຕັ້ງຄ່າ"; + diff --git a/firefox-ios/Shared/Supporting Files/nl.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/nl.lproj/AddressToolbar.strings index cf7e618228aa..6fbe1fb159d3 100644 --- a/firefox-ios/Shared/Supporting Files/nl.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/nl.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Privacy- en beveiligingsinstellingen"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Opent zoekmachineselectie"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Zoekmachine: %@"; diff --git a/firefox-ios/Shared/Supporting Files/nl.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/nl.lproj/FxANotification.strings new file mode 100644 index 000000000000..9f32064491b0 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/nl.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@-tabbladen gesloten: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Onlangs gesloten tabbladen bekijken"; + diff --git a/firefox-ios/Shared/Supporting Files/nl.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/nl.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..5a0f1f0ec912 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/nl.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Sluiten"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Zoekinstellingen openen"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Zoekinstellingen"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Deze keer zoeken in:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Zoekinstellingen"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Deze keer zoeken in:"; + diff --git a/firefox-ios/Shared/Supporting Files/nn.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/nn.lproj/AddressToolbar.strings index 584856d46448..7c95861f66ff 100644 --- a/firefox-ios/Shared/Supporting Files/nn.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/nn.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Innstillingar for personvern og sikkerheit"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Opnar søkjemotorval"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Søkjemotor: %@"; diff --git a/firefox-ios/Shared/Supporting Files/nn.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/nn.lproj/FxANotification.strings new file mode 100644 index 000000000000..714d6fe3e80c --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/nn.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ lét att %2$@ faner"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Vis nyleg attlatne faner"; + diff --git a/firefox-ios/Shared/Supporting Files/nn.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/nn.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..117798a67a73 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/nn.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Lat att"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Opne søkjeinnstillingar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Søkjeinnstillingar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Søk denne gongen i:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Søkjeinnstillingar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Søk denne gongen i:"; + diff --git a/firefox-ios/Shared/Supporting Files/pt-BR.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/pt-BR.lproj/AddressToolbar.strings index 578ff8050c2e..3eafb1fb065a 100644 --- a/firefox-ios/Shared/Supporting Files/pt-BR.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/pt-BR.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Configurações de privacidade e segurança"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Abre a seleção de mecanismo de pesquisa"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Mecanismo de pesquisa: %@"; diff --git a/firefox-ios/Shared/Supporting Files/pt-BR.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/pt-BR.lproj/FxANotification.strings new file mode 100644 index 000000000000..de366ae61e3e --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/pt-BR.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "Abas fechadas no %1$@: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Ver abas fechadas recentemente"; + diff --git a/firefox-ios/Shared/Supporting Files/pt-BR.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/pt-BR.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..7ae17235b307 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/pt-BR.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Fechar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Abre configurações de pesquisa"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Config. de pesquisa"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Desta vez, pesquisar em:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Configurações de pesquisa"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Desta vez, pesquisar em:"; + diff --git a/firefox-ios/Shared/Supporting Files/pt-PT.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/pt-PT.lproj/AddressToolbar.strings index b0511ca993de..99cef7d1d77a 100644 --- a/firefox-ios/Shared/Supporting Files/pt-PT.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/pt-PT.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Definições de privacidade e segurança"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Abre a seleção do motor de pesquisa"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Motor de pesquisa: %@"; diff --git a/firefox-ios/Shared/Supporting Files/pt-PT.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/pt-PT.lproj/FxANotification.strings new file mode 100644 index 000000000000..5596cb6162a5 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/pt-PT.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ separadores fechados: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Ver separadores fechados recentemente"; + diff --git a/firefox-ios/Shared/Supporting Files/pt-PT.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/pt-PT.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..4056152136c6 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/pt-PT.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Fechar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Abre as definições de pesquisa"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Definições de pesquisa"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Desta vez, pesquisar em:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Definições de pesquisa"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Desta vez, pesquisar em:"; + diff --git a/firefox-ios/Shared/Supporting Files/ru.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/ru.lproj/AddressToolbar.strings index 8363fed245c4..814f2d833f83 100644 --- a/firefox-ios/Shared/Supporting Files/ru.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/ru.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Настройки приватности и защиты"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Открывает выбор поисковой системы"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Поисковая система: %@"; diff --git a/firefox-ios/Shared/Supporting Files/ru.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/ru.lproj/FxANotification.strings new file mode 100644 index 000000000000..36de16f102fb --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/ru.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "Закрыто %1$@ вкладок: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Просмотр недавно закрытых вкладок"; + diff --git a/firefox-ios/Shared/Supporting Files/ru.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/ru.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..dc6f2b568d13 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/ru.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Закрыть"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Открывает настройки поиска"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Настройки поиска"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "В этот раз искать в:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Настройки поиска"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "В этот раз искать в:"; + diff --git a/firefox-ios/Shared/Supporting Files/sk.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/sk.lproj/AddressToolbar.strings index 4dc31782508f..5d4e48b22149 100644 --- a/firefox-ios/Shared/Supporting Files/sk.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/sk.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Nastavenia súkromia a zabezpečenia"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Otvorí výber vyhľadávacieho nástroja"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Vyhľadávací modul: %@"; diff --git a/firefox-ios/Shared/Supporting Files/sk.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/sk.lproj/FxANotification.strings new file mode 100644 index 000000000000..9ee546de5f77 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/sk.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "Zatvorené karty %1$@u: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Zobraziť nedávno zatvorené karty"; + diff --git a/firefox-ios/Shared/Supporting Files/sk.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/sk.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..9b71ecf4cc5a --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/sk.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Zavrieť"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Otvorí nastavenia vyhľadávania"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Hľadať v nastaveniach"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Tentokrát hľadať v:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Nastavenia vyhľadávania"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Tentokrát hľadať v:"; + diff --git a/firefox-ios/Shared/Supporting Files/sl.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/sl.lproj/AddressToolbar.strings index 91e07e0a30ec..e316f3e3694d 100644 --- a/firefox-ios/Shared/Supporting Files/sl.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/sl.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Nastavitve zasebnosti in varnosti"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Odpre meni z izbiro iskalnika"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Iskalnik: %@"; diff --git a/firefox-ios/Shared/Supporting Files/sl.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/sl.lproj/FxANotification.strings new file mode 100644 index 000000000000..59393822ddc3 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/sl.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "Zaprtih %1$@ zavihkov: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Prikaži nedavno zaprte zavihke"; + diff --git a/firefox-ios/Shared/Supporting Files/sl.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/sl.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..7d022b032f78 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/sl.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Zapri"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Odpre nastavitve iskanja"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Nastavitve iskanja"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Tokrat išči:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Nastavitve iskanja"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Tokrat išči:"; + diff --git a/firefox-ios/Shared/Supporting Files/sq.lproj/Bookmarks.strings b/firefox-ios/Shared/Supporting Files/sq.lproj/Bookmarks.strings index 5b19cd971427..dffc90323516 100644 --- a/firefox-ios/Shared/Supporting Files/sq.lproj/Bookmarks.strings +++ b/firefox-ios/Shared/Supporting Files/sq.lproj/Bookmarks.strings @@ -4,6 +4,9 @@ /* Name of the top level bookmarks folder present in the folder selection menu of the`Edit Bookmark` screen */ "Bookmarks.Menu.BookmarksTopLevelTitle.v131" = "Faqerojtës"; +/* The title for the Delete Bookmark button, in the Edit Bookmark popup screen which is summoned from the main menu's Save submenu, which will delete the currently bookmarked site from the user's bookmarks. */ +"Bookmarks.Menu.DeleteBookmark.v132" = "Fshije Faqerojtësin"; + /* Label of toast displayed after a bookmark is deleted in the Bookmarks menu. %@ is the name of the bookmark. */ "Bookmarks.Menu.DeletedBookmark.v131" = "U fshi “%@”"; diff --git a/firefox-ios/Shared/Supporting Files/sv.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/sv.lproj/AddressToolbar.strings index fb3e424ae203..665cb1b0155b 100644 --- a/firefox-ios/Shared/Supporting Files/sv.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/sv.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Sekretess & säkerhetsinställningar"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Öppnar val av sökmotor"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Sökmotor: %@"; diff --git a/firefox-ios/Shared/Supporting Files/sv.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/sv.lproj/FxANotification.strings new file mode 100644 index 000000000000..75afb7f8b28a --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/sv.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ stängde %2$@ flikar"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Visa nyligen stängda flikar"; + diff --git a/firefox-ios/Shared/Supporting Files/sv.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/sv.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..450bcedaf43f --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/sv.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Stäng"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Öppnar sökinställningar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Sökinställningar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Denna gång, sök med:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Sökinställningar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Denna gång, sök med:"; + diff --git a/firefox-ios/Shared/Supporting Files/tr.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/tr.lproj/AddressToolbar.strings index 8ac78933828b..82335d1f0afc 100644 --- a/firefox-ios/Shared/Supporting Files/tr.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/tr.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Gizlilik ve güvenlik ayarları"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Arama motoru seçimini açar"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Arama motoru: %@"; diff --git a/firefox-ios/Shared/Supporting Files/tr.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/tr.lproj/FxANotification.strings new file mode 100644 index 000000000000..9e23d5d47f47 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/tr.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ sekmeleri kapatıldı: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Son kapatılan sekmeleri göster"; + diff --git a/firefox-ios/Shared/Supporting Files/tr.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/tr.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..85aa444692fe --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/tr.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Kapat"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Arama ayarlarını açar"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Arama ayarları"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Burada ara:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Arama ayarları"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Burada ara:"; + diff --git a/firefox-ios/Shared/Supporting Files/ug.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/ug.lproj/AddressToolbar.strings index 42f69a17a227..7c356356c714 100644 --- a/firefox-ios/Shared/Supporting Files/ug.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/ug.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "شەخسىيەت ۋە بىخەتەرلىك تەڭشىكى"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "ئىزدەش موتورىنىڭ تاللىشىنى ئاچىدۇ"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "ئىزدەش موتورى: %@"; diff --git a/firefox-ios/Shared/Supporting Files/ug.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/ug.lproj/FxANotification.strings new file mode 100644 index 000000000000..a7d737e34072 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/ug.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ بەتكۈچ تاقالدى: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "يېقىندا تاقالغان بەتكۈچلەرنى كۆرسەت"; + diff --git a/firefox-ios/Shared/Supporting Files/ug.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/ug.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..94bbb6bbe9f8 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/ug.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "تاقا"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "ئىزدەش تەڭشىكىنى ئاچىدۇ"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "ئىزدەش تەڭشىكى"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "بۇ قېتىمقى ئىزدەش:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "ئىزدەش تەڭشىكى"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "بۇ قېتىمقى ئىزدەش:"; + diff --git a/firefox-ios/Shared/Supporting Files/uk.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/uk.lproj/AddressToolbar.strings index 3a60f7ef4f63..ea79bd89f39c 100644 --- a/firefox-ios/Shared/Supporting Files/uk.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/uk.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Параметри приватності та безпеки"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Відкриття вибору пошукової системи"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Пошукова система: %@"; diff --git a/firefox-ios/Shared/Supporting Files/uk.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/uk.lproj/FxANotification.strings new file mode 100644 index 000000000000..ad364879763a --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/uk.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "Закрито вкладки %1$@: %2$@"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Переглянути недавно закриті вкладки"; + diff --git a/firefox-ios/Shared/Supporting Files/uk.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/uk.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..710fdb27aadb --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/uk.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Закрити"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Відкриття налаштувань пошуку"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Налаштування пошуку"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Цього разу шукати в:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Налаштування пошуку"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Цього разу шукати в:"; + diff --git a/firefox-ios/Shared/Supporting Files/vi.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/vi.lproj/AddressToolbar.strings index cda1736e16fa..1ed8dbfeab54 100644 --- a/firefox-ios/Shared/Supporting Files/vi.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/vi.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "Cài đặt quyền riêng tư & bảo mật"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "Mở lựa chọn công cụ tìm kiếm"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "Công cụ tìm kiếm: %@"; diff --git a/firefox-ios/Shared/Supporting Files/vi.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/vi.lproj/FxANotification.strings new file mode 100644 index 000000000000..d30f3cc1f4fe --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/vi.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%2$@ thẻ %1$@ đã đóng"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "Xem thẻ đã đóng gần đây"; + diff --git a/firefox-ios/Shared/Supporting Files/vi.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/vi.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..630a221ebaf6 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/vi.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "Đóng"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "Mở cài đặt tìm kiếm"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "Cài đặt tìm kiếm"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "Lần này tìm kiếm với:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "Cài đặt tìm kiếm"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "Lần này tìm kiếm với:"; + diff --git a/firefox-ios/Shared/Supporting Files/zh-CN.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/zh-CN.lproj/AddressToolbar.strings index 162f24c36f21..7abc2f71f9fc 100644 --- a/firefox-ios/Shared/Supporting Files/zh-CN.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/zh-CN.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "隐私与安全设置"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "打开搜索引擎选择菜单"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "搜索引擎:%@"; diff --git a/firefox-ios/Shared/Supporting Files/zh-CN.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/zh-CN.lproj/FxANotification.strings new file mode 100644 index 000000000000..2ba64b1fcbb4 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/zh-CN.lproj/FxANotification.strings @@ -0,0 +1,3 @@ +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "查看最近关闭的标签页"; + diff --git a/firefox-ios/Shared/Supporting Files/zh-CN.lproj/NativeErrorPage.strings b/firefox-ios/Shared/Supporting Files/zh-CN.lproj/NativeErrorPage.strings index d3a54061165f..b0b0186eab56 100644 --- a/firefox-ios/Shared/Supporting Files/zh-CN.lproj/NativeErrorPage.strings +++ b/firefox-ios/Shared/Supporting Files/zh-CN.lproj/NativeErrorPage.strings @@ -8,7 +8,7 @@ "NativeErrorPage.GenericError.TitleLabel.v131" = "当心,看来有异常情况。"; /* On error page, this is the description for no internet connection. */ -"NativeErrorPage.NoInternetConnection.Description.v131" = "请尝试通过其他设备连接,检查调制解调器或路由器,断开 Wi-Fi 连接后重新连接。"; +"NativeErrorPage.NoInternetConnection.Description.v131" = "请尝试通过其他设备连接、检查调制解调器或路由器、断开 Wi-Fi 连接后重新连接。"; /* On error page, this is the title for no internet connection */ "NativeErrorPage.NoInternetConnection.TitleLabel.v131" = "您的网络连接似乎出了点问题。"; diff --git a/firefox-ios/Shared/Supporting Files/zh-CN.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/zh-CN.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..b0bdb85389f8 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/zh-CN.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "关闭"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "打开搜索设置"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "搜索设置"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "本次搜索使用:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "搜索设置"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "本次搜索使用:"; + diff --git a/firefox-ios/Shared/Supporting Files/zh-TW.lproj/AddressToolbar.strings b/firefox-ios/Shared/Supporting Files/zh-TW.lproj/AddressToolbar.strings index d4226ab89443..9fe922fb8fb5 100644 --- a/firefox-ios/Shared/Supporting Files/zh-TW.lproj/AddressToolbar.strings +++ b/firefox-ios/Shared/Supporting Files/zh-TW.lproj/AddressToolbar.strings @@ -7,6 +7,9 @@ /* Accessibility label for the lock icon button in the address field of the address toolbar, responsible with Privacy & Security Settings. */ "AddressToolbar.PrivacyAndSecuriySettings.A11y.Label.v128" = "隱私權與安全性設定"; +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint describing what tapping the search engine icon does. */ +"AddressToolbar.SearchEngine.A11y.Hint.v133" = "開啟搜尋引擎選擇表"; + /* Accessibility label for the search engine icon in the address field of the address toolbar. The placeholder is getting replaced with the name of the search engine (e.g. Google). */ "AddressToolbar.SearchEngine.A11y.Label.v128" = "搜尋引擎:%@"; diff --git a/firefox-ios/Shared/Supporting Files/zh-TW.lproj/FxANotification.strings b/firefox-ios/Shared/Supporting Files/zh-TW.lproj/FxANotification.strings new file mode 100644 index 000000000000..78a894d526f6 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/zh-TW.lproj/FxANotification.strings @@ -0,0 +1,6 @@ +/* Title of notification shown when a remote device has requested to close a number of tabs. First parameter is the app name and the second parameter is the number of tabs. */ +"CloseTab.ArrivingNotification.title.v133" = "%1$@ 關閉了 %2$@ 個分頁"; + +/* Label for an action used to view recently closed tabs. */ +"CloseTab.ViewAction.title.v133" = "檢視最近關閉的分頁"; + diff --git a/firefox-ios/Shared/Supporting Files/zh-TW.lproj/SearchEngineSelection.strings b/firefox-ios/Shared/Supporting Files/zh-TW.lproj/SearchEngineSelection.strings new file mode 100644 index 000000000000..3490c68328d5 --- /dev/null +++ b/firefox-ios/Shared/Supporting Files/zh-TW.lproj/SearchEngineSelection.strings @@ -0,0 +1,18 @@ +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the sheet's close button. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.CloseButton.Label.v133" = "關閉"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility hint for tapping the search settings row at the bottom of the list, which opens the app's search settings screen. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Hint.v133" = "將開啟搜尋設定"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the row at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.SearchSettings.Label.v133" = "搜尋設定"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the accessibility label for the title of that sheet. */ +"UnifiedSearch.SearchEngineSelection.AccessibilityLabels.TopTitle.Label.v133" = "這次使用下列搜尋引擎搜尋:"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This string is the label for the button at the bottom of the list. When this row is tapped, the app's search settings screen appears. */ +"UnifiedSearch.SearchEngineSelection.SearchSettings.Title.v133" = "搜尋設定"; + +/* When the user taps the search engine icon in the toolbar, a sheet with a list of alternative search engines appears. This is the title for the sheet. */ +"UnifiedSearch.SearchEngineSelection.TopTitle.Title.v133" = "這次使用下列搜尋引擎搜尋:"; + diff --git a/firefox-ios/Shared/fa.lproj/Localizable.strings b/firefox-ios/Shared/fa.lproj/Localizable.strings index 4a215307f42e..00959e2127f3 100644 --- a/firefox-ios/Shared/fa.lproj/Localizable.strings +++ b/firefox-ios/Shared/fa.lproj/Localizable.strings @@ -976,9 +976,18 @@ /* General settings section title */ "Settings.General.SectionName" = "عمومی"; +/* In the settings menu, in the Firefox homepage customization section, this is the title for the option that allows users to toggle Shortcuts section on the Firefox homepage on or off */ +"Settings.Home.Option.Shortcuts" = "میانبرها"; + /* Label used as an item in Settings. When touched it will open a dialog to configure the home page and its uses. */ "Settings.HomePage.SectionName" = "صفحه خانه"; +/* Users can disable or enable shortcuts related settings. This string is the title of the page to change your shortcuts settings. */ +"Settings.Homepage.Shortcuts.ShortcutsPageTitle.v100" = "میانبرها"; + +/* This string is the title of the toggle to disable the shortcuts section in the settings page. */ +"Settings.Homepage.Shortcuts.ShortcutsToggle.v100" = "میانبرها"; + /* Title of the setting section containing the URL of the current home page. */ "Settings.HomePage.URL.Title" = "صفحه خانگی فعلی"; diff --git a/firefox-ios/Shared/gd.lproj/Localizable.strings b/firefox-ios/Shared/gd.lproj/Localizable.strings index 23cc1c75fcb2..3de0e00fb563 100644 --- a/firefox-ios/Shared/gd.lproj/Localizable.strings +++ b/firefox-ios/Shared/gd.lproj/Localizable.strings @@ -848,13 +848,13 @@ "Menu.TrackingProtectionDescription.CryptominersNew" = "Cleachdaidh criopto-mhèinneadairean comasan an t-siostaim agad airson airgead digiteach a chosnadh gun fhiosta. Traoghaidh criopto-mhèinneadairean am bataraidh agad, nì iad an coimpiutair agad slaodach agus faodaidh gun èirich cosgaisean dealain dhut."; /* Description of fingerprinters. */ -"Menu.TrackingProtectionDescription.Fingerprinters" = "Tha na roghainnean àraidh aig a’ bhrabhsair agus aig a’ choimpiutair agad. Tha lorgaichean-meur ann a chruinnicheas badan dhe na roghainnean àraidh seo airson pròifil a chruthachadh dhìot agus gabhaidh do thracadh air an lìon leotha."; +"Menu.TrackingProtectionDescription.Fingerprinters" = "Tha na roghainnean àraidh aig a’ bhrabhsair agus aig a’ choimpiutair agad. Tha lorgairean-meòir ann a chruinnicheas badan dhe na roghainnean àraidh seo airson pròifil a chruthachadh dhìot agus gabhaidh do thracadh air an lìon leotha."; /* Description of social network trackers. */ "Menu.TrackingProtectionDescription.SocialNetworksNew" = "Cuiridh lìonraidhean sòisealta tracaichean air làraichean-lìn eile airson pròifil nas iomlaine dhìot a chruthachadh. Ma bhacas tu na tracaichean seo, chì companaidhean nam meadhan sòisealta nas lugha dhe na nì thu air loidhne."; /* The title that shows the number of fingerprinting scripts blocked */ -"Menu.TrackingProtectionFingerprintersBlocked.Title" = "Lorgaichean-meur"; +"Menu.TrackingProtectionFingerprintersBlocked.Title" = "Lorgairean-meòir"; /* The title for the option to view the What's new page. */ "Menu.WhatsNew.Title" = "Na tha ùr"; diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/OpenSearchEngineTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/OpenSearchEngineTests.swift index 2dfe60bb65aa..be9650505488 100644 --- a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/OpenSearchEngineTests.swift +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/OpenSearchEngineTests.swift @@ -10,7 +10,7 @@ import Storage class OpenSearchEngineTests: XCTestCase { func testEncodeDecodeOpenSearchEngine_withBundledImages_Single() throws { - let searchEngine = try generateOpenSearchEngine(type: .wikipedia) + let searchEngine = try Self.generateOpenSearchEngine(type: .wikipedia) // Encode the data let data = try NSKeyedArchiver.archivedData(withRootObject: searchEngine, requiringSecureCoding: true) @@ -30,8 +30,8 @@ class OpenSearchEngineTests: XCTestCase { } func testEncodeDecodeOpenSearchEngine_withBundledImages_Array() throws { - let searchEngine1 = try generateOpenSearchEngine(type: .wikipedia) - let searchEngine2 = try generateOpenSearchEngine(type: .youtube) + let searchEngine1 = try Self.generateOpenSearchEngine(type: .wikipedia) + let searchEngine2 = try Self.generateOpenSearchEngine(type: .youtube) let dataToEncode = [searchEngine1, searchEngine2] @@ -52,8 +52,8 @@ class OpenSearchEngineTests: XCTestCase { func testCustomSearchEnginesSavedToFile_canRetrievesImageData() throws { // Test reading and writing OpenSearchEngines to the same customEngines plist file as done within the app. - let searchEngine1 = try generateOpenSearchEngine(type: .wikipedia) - let searchEngine2 = try generateOpenSearchEngine(type: .youtube) + let searchEngine1 = try Self.generateOpenSearchEngine(type: .wikipedia) + let searchEngine2 = try Self.generateOpenSearchEngine(type: .youtube) // Encode the data let searchEngines = [searchEngine1, searchEngine2] @@ -90,7 +90,7 @@ class OpenSearchEngineTests: XCTestCase { } /// For generating test `OpenSearchEngine` data. - private enum TestSearchEngine { + public enum TestSearchEngine { case youtube, wikipedia var engineID: String { @@ -119,7 +119,7 @@ class OpenSearchEngineTests: XCTestCase { } /// Creates a single `OpenSearchEngine` with valid image data pulled from the test's asset catalog. - private func generateOpenSearchEngine(type: TestSearchEngine) throws -> OpenSearchEngine { + public static func generateOpenSearchEngine(type: TestSearchEngine) throws -> OpenSearchEngine { guard let testImage = UIImage( named: type.imageName, in: Bundle(for: OpenSearchEngineTests.self), @@ -128,6 +128,10 @@ class OpenSearchEngineTests: XCTestCase { throw OpenSearchEngineError.imageNotInBundle } + return generateOpenSearchEngine(type: type, withImage: testImage) + } + + public static func generateOpenSearchEngine(type: TestSearchEngine, withImage testImage: UIImage) -> OpenSearchEngine { return OpenSearchEngine( engineID: type.engineID, shortName: type.name, diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchEngineSelectionMiddlewareTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchEngineSelectionMiddlewareTests.swift new file mode 100644 index 000000000000..5f9dda8eebcf --- /dev/null +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchEngineSelectionMiddlewareTests.swift @@ -0,0 +1,64 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/ + +import Redux +import XCTest + +@testable import Client + +final class SearchEngineSelectionMiddlewareTests: XCTestCase { + var mockProfile: MockProfile! + var mockSearchEngines: [OpenSearchEngine]! + + override func setUp() { + super.setUp() + DependencyHelperMock().bootstrapDependencies() + mockProfile = MockProfile() + mockSearchEngines = [ + OpenSearchEngineTests.generateOpenSearchEngine(type: .wikipedia, withImage: UIImage()), + OpenSearchEngineTests.generateOpenSearchEngine(type: .youtube, withImage: UIImage()), + ] + } + + override func tearDown() { + DependencyHelperMock().reset() + super.tearDown() + } + + func testDismissMenuAction() throws { + let mockSearchEnginesManager = SearchEnginesManager(prefs: mockProfile.prefs, files: mockProfile.files) + mockSearchEnginesManager.orderedEngines = mockSearchEngines + + let subject = createSubject(mockSearchEnginesManager: mockSearchEnginesManager) + let action = getAction(for: .viewDidLoad) + + let testStore = Store( + state: AppState(), + reducer: AppState.reducer, + middlewares: [subject.searchEngineSelectionProvider] + ) + + testStore.dispatch(action) + + // Currently we have a testability problem with our redux archicture: + // 1) Every middleware calls the global `store` + // 2) We have one global store so every test (including tests running in parallel) accesses the same store + // + // Ideally we would be able to check that the middleware fired an action of a specific type with a specific payload. + throw XCTSkip("Need Store architecture changes if we want to implement tests") + } + + // MARK: - Helpers + + private func createSubject(mockSearchEnginesManager: SearchEnginesManager) -> SearchEngineSelectionMiddleware { + return SearchEngineSelectionMiddleware(profile: mockProfile, searchEnginesManager: mockSearchEnginesManager) + } + + private func getAction(for actionType: SearchEngineSelectionActionType) -> SearchEngineSelectionAction { + return SearchEngineSelectionAction( + windowUUID: .XCTestDefaultUUID, + actionType: actionType + ) + } +} diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchEngineSelectionStateTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchEngineSelectionStateTests.swift new file mode 100644 index 000000000000..e1c1ab6b8297 --- /dev/null +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchEngineSelectionStateTests.swift @@ -0,0 +1,59 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/ + +import Redux +import XCTest + +@testable import Client + +final class SearchEngineSelectionStateTests: XCTestCase { + override func setUp() { + super.setUp() + DependencyHelperMock().bootstrapDependencies() + } + + override func tearDown() { + DependencyHelperMock().reset() + super.tearDown() + } + + func testInitialization() { + let initialState = createSubject() + + XCTAssertFalse(initialState.shouldDismiss) + XCTAssertEqual(initialState.searchEngines, []) + } + + func testDidLoadSearchEngines() { + let initialState = createSubject() + let reducer = searchEngineSelectionReducer() + + let expectedResult: [OpenSearchEngine] = [ + OpenSearchEngineTests.generateOpenSearchEngine(type: .wikipedia, withImage: UIImage()), + OpenSearchEngineTests.generateOpenSearchEngine(type: .youtube, withImage: UIImage()) + ] + + XCTAssertEqual(initialState.searchEngines, []) + + let newState = reducer( + initialState, + SearchEngineSelectionAction( + windowUUID: .XCTestDefaultUUID, + actionType: SearchEngineSelectionActionType.didLoadSearchEngines, + searchEngines: expectedResult + ) + ) + + XCTAssertEqual(newState.searchEngines, expectedResult) + } + + // MARK: - Private + private func createSubject() -> SearchEngineSelectionState { + return SearchEngineSelectionState(windowUUID: .XCTestDefaultUUID) + } + + private func searchEngineSelectionReducer() -> Reducer { + return SearchEngineSelectionState.reducer + } +} diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchEnginesTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchEnginesManagerTests.swift similarity index 53% rename from firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchEnginesTests.swift rename to firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchEnginesManagerTests.swift index b828d463cd09..6bfa972672f3 100644 --- a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchEnginesTests.swift +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchEnginesManagerTests.swift @@ -7,11 +7,11 @@ import Foundation import XCTest import Shared -class SearchEnginesTests: XCTestCase { +class SearchEnginesManagerTests: XCTestCase { private let defaultSearchEngineName = "ATester" private let expectedEngineNames = ["ATester", "BTester", "CTester", "DTester", "ETester", "FTester"] private var profile: Profile! - private var engines: SearchEngines! + private var searchEnginesManager: SearchEnginesManager! private var orderedEngines: [OpenSearchEngine]! private var mockSearchEngineProvider: MockSearchEngineProvider! @@ -20,7 +20,7 @@ class SearchEnginesTests: XCTestCase { profile = MockProfile() mockSearchEngineProvider = MockSearchEngineProvider() - engines = SearchEngines( + searchEnginesManager = SearchEnginesManager( prefs: profile.prefs, files: profile.files, engineProvider: mockSearchEngineProvider @@ -32,15 +32,15 @@ class SearchEnginesTests: XCTestCase { profile = nil mockSearchEngineProvider = nil - engines = nil + searchEnginesManager = nil } func testIncludesExpectedEngines() { // Verify that the set of shipped engines includes the expected subset. let expectation = expectation(description: "Completed parse engines") - engines.getOrderedEngines { result in - XCTAssertEqual(self.engines.orderedEngines.count, 6) + searchEnginesManager.getOrderedEngines { result in + XCTAssertEqual(self.searchEnginesManager.orderedEngines.count, 6) expectation.fulfill() } @@ -49,12 +49,12 @@ class SearchEnginesTests: XCTestCase { func testDefaultEngineOnStartup() { // If this is our first run, Google should be first for the en locale. - XCTAssertEqual(engines.defaultEngine?.shortName, defaultSearchEngineName) - XCTAssertEqual(engines.orderedEngines[0].shortName, defaultSearchEngineName) + XCTAssertEqual(searchEnginesManager.defaultEngine?.shortName, defaultSearchEngineName) + XCTAssertEqual(searchEnginesManager.orderedEngines[0].shortName, defaultSearchEngineName) } func testAddingAndDeletingCustomEngines() { - guard let testImage = UIImage(named: "wikipedia", in: Bundle(for: SearchEnginesTests.self), with: nil) else { + guard let testImage = UIImage(named: "wikipedia", in: Bundle(for: SearchEnginesManagerTests.self), with: nil) else { XCTFail("Check that image is bundled for testing") return } @@ -65,32 +65,32 @@ class SearchEnginesTests: XCTestCase { suggestTemplate: nil, isCustomEngine: true) - engines.orderedEngines[0] = testEngine - engines.addSearchEngine(testEngine) - XCTAssertEqual(engines.orderedEngines[1].engineID, testEngine.engineID) + searchEnginesManager.orderedEngines[0] = testEngine + searchEnginesManager.addSearchEngine(testEngine) + XCTAssertEqual(searchEnginesManager.orderedEngines[1].engineID, testEngine.engineID) var deleted: [OpenSearchEngine] = [] - engines.deleteCustomEngine(testEngine) { [self] in - deleted = engines.orderedEngines.filter { $0 == testEngine } + searchEnginesManager.deleteCustomEngine(testEngine) { [self] in + deleted = searchEnginesManager.orderedEngines.filter { $0 == testEngine } } XCTAssertEqual(deleted, []) } func testDefaultEngine() { - let engineSet = engines.orderedEngines + let engineSet = searchEnginesManager.orderedEngines - engines.defaultEngine = (engineSet?[0])! - XCTAssertTrue(engines.isEngineDefault((engineSet?[0])!)) - XCTAssertFalse(engines.isEngineDefault((engineSet?[1])!)) + searchEnginesManager.defaultEngine = (engineSet?[0])! + XCTAssertTrue(searchEnginesManager.isEngineDefault((engineSet?[0])!)) + XCTAssertFalse(searchEnginesManager.isEngineDefault((engineSet?[1])!)) // The first ordered engine is the default. - XCTAssertEqual(engines.orderedEngines[0].shortName, engineSet?[0].shortName) + XCTAssertEqual(searchEnginesManager.orderedEngines[0].shortName, engineSet?[0].shortName) - engines.defaultEngine = (engineSet?[1])! - XCTAssertFalse(engines.isEngineDefault((engineSet?[0])!)) - XCTAssertTrue(engines.isEngineDefault((engineSet?[1])!)) + searchEnginesManager.defaultEngine = (engineSet?[1])! + XCTAssertFalse(searchEnginesManager.isEngineDefault((engineSet?[0])!)) + XCTAssertTrue(searchEnginesManager.isEngineDefault((engineSet?[1])!)) // The first ordered engine is the default. - XCTAssertEqual(engines.orderedEngines[0].shortName, engineSet?[1].shortName) + XCTAssertEqual(searchEnginesManager.orderedEngines[0].shortName, engineSet?[1].shortName) // Persistence can't be tested without the fixture changing. } @@ -99,7 +99,7 @@ class SearchEnginesTests: XCTestCase { // Persistence can't be tested without the default fixture changing. // Remaining engines should be appended in alphabetical order. let expectation = expectation(description: "Completed parse engines") - engines.getOrderedEngines { [weak self] orderedEngines in + searchEnginesManager.getOrderedEngines { [weak self] orderedEngines in guard let self = self else { XCTFail("Could not weakify self.") return @@ -115,45 +115,45 @@ class SearchEnginesTests: XCTestCase { } func testQuickSearchEngines() { - let engineSet = engines.orderedEngines + let engineSet = searchEnginesManager.orderedEngines // You can't disable the default engine. - engines.defaultEngine = (engineSet?[1])! - engines.disableEngine((engineSet?[1])!) - XCTAssertTrue(engines.isEngineEnabled((engineSet?[1])!)) + searchEnginesManager.defaultEngine = (engineSet?[1])! + searchEnginesManager.disableEngine((engineSet?[1])!) + XCTAssertTrue(searchEnginesManager.isEngineEnabled((engineSet?[1])!)) // The default engine is not included in the quick search engines. XCTAssertEqual( 0, - engines.quickSearchEngines.filter { engine in engine.shortName == engineSet?[1].shortName }.count) + searchEnginesManager.quickSearchEngines.filter { engine in engine.shortName == engineSet?[1].shortName }.count) // Enable and disable work. - engines.enableEngine((engineSet?[0])!) - XCTAssertTrue(engines.isEngineEnabled((engineSet?[0])!)) + searchEnginesManager.enableEngine((engineSet?[0])!) + XCTAssertTrue(searchEnginesManager.isEngineEnabled((engineSet?[0])!)) XCTAssertEqual( 1, - engines.quickSearchEngines.filter { engine in engine.shortName == engineSet?[0].shortName }.count) + searchEnginesManager.quickSearchEngines.filter { engine in engine.shortName == engineSet?[0].shortName }.count) - engines.disableEngine((engineSet?[0])!) - XCTAssertFalse(engines.isEngineEnabled((engineSet?[0])!)) + searchEnginesManager.disableEngine((engineSet?[0])!) + XCTAssertFalse(searchEnginesManager.isEngineEnabled((engineSet?[0])!)) XCTAssertEqual( 0, - engines.quickSearchEngines.filter { engine in engine.shortName == engineSet?[0].shortName }.count) + searchEnginesManager.quickSearchEngines.filter { engine in engine.shortName == engineSet?[0].shortName }.count) // Setting the default engine enables it. - engines.defaultEngine = (engineSet?[0])! - XCTAssertTrue(engines.isEngineEnabled((engineSet?[1])!)) + searchEnginesManager.defaultEngine = (engineSet?[0])! + XCTAssertTrue(searchEnginesManager.isEngineEnabled((engineSet?[1])!)) // Setting the order may change the default engine, which enables it. - engines.orderedEngines = [(engineSet?[2])!, (engineSet?[1])!, (engineSet?[0])!] - XCTAssertTrue(engines.isEngineDefault((engineSet?[2])!)) - XCTAssertTrue(engines.isEngineEnabled((engineSet?[2])!)) + searchEnginesManager.orderedEngines = [(engineSet?[2])!, (engineSet?[1])!, (engineSet?[0])!] + XCTAssertTrue(searchEnginesManager.isEngineDefault((engineSet?[2])!)) + XCTAssertTrue(searchEnginesManager.isEngineEnabled((engineSet?[2])!)) // The enabling should be persisted. - engines.enableEngine((engineSet?[2])!) - engines.disableEngine((engineSet?[1])!) - engines.enableEngine((engineSet?[0])!) + searchEnginesManager.enableEngine((engineSet?[2])!) + searchEnginesManager.disableEngine((engineSet?[1])!) + searchEnginesManager.enableEngine((engineSet?[0])!) - let engines2 = SearchEngines(prefs: profile.prefs, files: profile.files) + let engines2 = SearchEnginesManager(prefs: profile.prefs, files: profile.files) XCTAssertTrue(engines2.isEngineEnabled((engineSet?[2])!)) XCTAssertFalse(engines2.isEngineEnabled((engineSet?[1])!)) XCTAssertTrue(engines2.isEngineEnabled((engineSet?[0])!)) @@ -161,27 +161,27 @@ class SearchEnginesTests: XCTestCase { func testSearchSuggestionSettings() { // By default, you should see search suggestions - XCTAssertTrue(engines.shouldShowSearchSuggestions) + XCTAssertTrue(searchEnginesManager.shouldShowSearchSuggestions) // Persistence can't be tested without the default fixture changing. // Setting should be persisted. - engines.shouldShowSearchSuggestions = false - XCTAssertFalse(engines.shouldShowSearchSuggestions) + searchEnginesManager.shouldShowSearchSuggestions = false + XCTAssertFalse(searchEnginesManager.shouldShowSearchSuggestions) } func testShowSearchSuggestionSettingsInPrivateMode() { // Disable search suggestions by default - XCTAssertFalse(engines.shouldShowPrivateModeSearchSuggestions) + XCTAssertFalse(searchEnginesManager.shouldShowPrivateModeSearchSuggestions) XCTAssertEqual(profile.prefs.boolForKey(PrefsKeys.SearchSettings.showPrivateModeSearchSuggestions), false) // Turn off setting - engines.shouldShowPrivateModeSearchSuggestions = false - XCTAssertFalse(engines.shouldShowPrivateModeSearchSuggestions) + searchEnginesManager.shouldShowPrivateModeSearchSuggestions = false + XCTAssertFalse(searchEnginesManager.shouldShowPrivateModeSearchSuggestions) XCTAssertEqual(profile.prefs.boolForKey(PrefsKeys.SearchSettings.showPrivateModeSearchSuggestions), false) // Turn on setting - engines.shouldShowPrivateModeSearchSuggestions = true - XCTAssertTrue(engines.shouldShowPrivateModeSearchSuggestions) + searchEnginesManager.shouldShowPrivateModeSearchSuggestions = true + XCTAssertTrue(searchEnginesManager.shouldShowPrivateModeSearchSuggestions) XCTAssertEqual(profile.prefs.boolForKey(PrefsKeys.SearchSettings.showPrivateModeSearchSuggestions), true) } @@ -189,9 +189,9 @@ class SearchEnginesTests: XCTestCase { // Verify that the set of shipped engines includes the expected subset. let expectation = expectation(description: "Completed parse engines") - engines.getOrderedEngines { result in - XCTAssert(self.engines.orderedEngines.count > 1, "There should be more than one search engine") - XCTAssertEqual(self.engines.orderedEngines.first?.shortName, "ATester") + searchEnginesManager.getOrderedEngines { result in + XCTAssert(self.searchEnginesManager.orderedEngines.count > 1, "There should be more than one search engine") + XCTAssertEqual(self.searchEnginesManager.orderedEngines.first?.shortName, "ATester") expectation.fulfill() } diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchTests.swift index 6c3b2639fe03..af3ed8898b3c 100644 --- a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchTests.swift +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Browser/SearchEngines/SearchTests.swift @@ -72,6 +72,8 @@ class SearchTests: XCTestCase { withExtendedLifetime(client) { if error != nil { XCTFail("Error: \(error?.description ?? "nil")") + query1.fulfill() + return } XCTAssertEqual(response![0], "foo") @@ -88,6 +90,8 @@ class SearchTests: XCTestCase { withExtendedLifetime(client) { if error != nil { XCTFail("Error: \(error?.description ?? "nil")") + query2.fulfill() + return } XCTAssertEqual(response![0], "foo bar soap") diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Home/TopSites/TopSitesDataAdaptorTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Home/TopSites/TopSitesDataAdaptorTests.swift index bc3a9d17c38a..da5c6c6a5c0d 100644 --- a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Home/TopSites/TopSitesDataAdaptorTests.swift +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Frontend/Home/TopSites/TopSitesDataAdaptorTests.swift @@ -546,7 +546,7 @@ extension TopSitesDataAdaptorTests { } func add(searchEngine: OpenSearchEngine) { - profile.searchEngines.defaultEngine = searchEngine + profile.searchEnginesManager.defaultEngine = searchEngine } } diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Mocks/MockProfile.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Mocks/MockProfile.swift index a3e867396715..2c3cca159eea 100644 --- a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Mocks/MockProfile.swift +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Mocks/MockProfile.swift @@ -169,8 +169,8 @@ open class MockProfile: Client.Profile { return CertStore() }() - public lazy var searchEngines: SearchEngines = { - return SearchEngines(prefs: self.prefs, files: self.files) + public lazy var searchEnginesManager: SearchEnginesManager = { + return SearchEnginesManager(prefs: self.prefs, files: self.files) }() public lazy var prefs: Prefs = { diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Search/SearchViewControllerTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Search/SearchViewControllerTests.swift index b4e8cad3d786..4554c047db94 100644 --- a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Search/SearchViewControllerTests.swift +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Search/SearchViewControllerTests.swift @@ -11,7 +11,7 @@ import XCTest class SearchViewControllerTest: XCTestCase { var profile: MockProfile! - var engines: SearchEngines! + var searchEnginesManager: SearchEnginesManager! var searchViewController: SearchViewController! override func setUp() { @@ -22,7 +22,7 @@ class SearchViewControllerTest: XCTestCase { LegacyFeatureFlagsManager.shared.set(feature: .firefoxSuggestFeature, to: true) let mockSearchEngineProvider = MockSearchEngineProvider() - engines = SearchEngines( + searchEnginesManager = SearchEnginesManager( prefs: profile.prefs, files: profile.files, engineProvider: mockSearchEngineProvider @@ -31,7 +31,7 @@ class SearchViewControllerTest: XCTestCase { isPrivate: false, isBottomSearchBar: false, profile: profile, - model: engines, + model: searchEnginesManager, tabManager: MockTabManager() ) @@ -48,7 +48,7 @@ class SearchViewControllerTest: XCTestCase { } func testHistoryAndBookmarksAreFilteredWhenShowSponsoredSuggestionsIsTrue() { - engines.shouldShowSponsoredSuggestions = true + searchEnginesManager.shouldShowSponsoredSuggestions = true let data = ArrayCursor(data: [ Site(url: "https://example.com?mfadid=adm", title: "Test1"), Site(url: "https://example.com", title: "Test2"), Site(url: "https://example.com?a=b&c=d", title: "Test3")]) @@ -58,7 +58,7 @@ class SearchViewControllerTest: XCTestCase { } func testHistoryAndBookmarksAreNotFilteredWhenShowSponsoredSuggestionsIsFalse() { - engines.shouldShowSponsoredSuggestions = false + searchEnginesManager.shouldShowSponsoredSuggestions = false let data = ArrayCursor(data: [ Site(url: "https://example.com?mfadid=adm", title: "Test1"), Site(url: "https://example.com", title: "Test2"), Site(url: "https://example.com?a=b&c=d", title: "Test3")]) diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Search/SearchViewModelTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Search/SearchViewModelTests.swift index 366c47886503..fd716bd1f80f 100644 --- a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Search/SearchViewModelTests.swift +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Search/SearchViewModelTests.swift @@ -12,7 +12,7 @@ import XCTest final class SearchViewModelTests: XCTestCase { var profile: MockProfile! var mockDelegate: MockSearchDelegate! - var engines: SearchEngines! + var searchEnginesManager: SearchEnginesManager! var remoteClient: RemoteClient! override func setUp() { @@ -25,7 +25,7 @@ final class SearchViewModelTests: XCTestCase { let mockSearchEngineProvider = MockSearchEngineProvider() mockDelegate = MockSearchDelegate() - engines = SearchEngines( + searchEnginesManager = SearchEnginesManager( prefs: profile.prefs, files: profile.files, engineProvider: mockSearchEngineProvider @@ -54,16 +54,16 @@ final class SearchViewModelTests: XCTestCase { [.amp: false, .ampMobile: false, .wikipedia: false]) }) - engines.shouldShowFirefoxSuggestions = false - engines.shouldShowSponsoredSuggestions = false + searchEnginesManager.shouldShowFirefoxSuggestions = false + searchEnginesManager.shouldShowSponsoredSuggestions = false let subject = createSubject() await subject.loadFirefoxSuggestions()?.value XCTAssertEqual(subject.firefoxSuggestions.count, 0) // Providers set to false, so regardless of the prefs, we shouldn't see anything - engines.shouldShowFirefoxSuggestions = true - engines.shouldShowSponsoredSuggestions = true + searchEnginesManager.shouldShowFirefoxSuggestions = true + searchEnginesManager.shouldShowSponsoredSuggestions = true await subject.loadFirefoxSuggestions()?.value XCTAssertEqual(subject.firefoxSuggestions.count, 0) } @@ -74,8 +74,8 @@ final class SearchViewModelTests: XCTestCase { [.amp: false, .ampMobile: true, .wikipedia: true]) }) - engines.shouldShowFirefoxSuggestions = false - engines.shouldShowSponsoredSuggestions = false + searchEnginesManager.shouldShowFirefoxSuggestions = false + searchEnginesManager.shouldShowSponsoredSuggestions = false let subject = createSubject() @@ -90,8 +90,8 @@ final class SearchViewModelTests: XCTestCase { [.amp: false, .ampMobile: true, .wikipedia: true]) }) - engines.shouldShowFirefoxSuggestions = true - engines.shouldShowSponsoredSuggestions = true + searchEnginesManager.shouldShowFirefoxSuggestions = true + searchEnginesManager.shouldShowSponsoredSuggestions = true let subject = createSubject() await subject.loadFirefoxSuggestions()?.value @@ -100,7 +100,7 @@ final class SearchViewModelTests: XCTestCase { } func testSyncedTabsAreFilteredWhenShowSponsoredSuggestionsIsTrue() { - engines.shouldShowSponsoredSuggestions = true + searchEnginesManager.shouldShowSponsoredSuggestions = true let remoteTab1 = RemoteTab( clientGUID: "1", URL: URL(string: "www.mozilla.org?mfadid=adm")!, @@ -137,7 +137,7 @@ final class SearchViewModelTests: XCTestCase { } func testSyncedTabsAreNotFilteredWhenShowSponsoredSuggestionsIsFalse() { - engines.shouldShowSponsoredSuggestions = false + searchEnginesManager.shouldShowSponsoredSuggestions = false let remoteTab1 = RemoteTab( clientGUID: "1", @@ -176,8 +176,8 @@ final class SearchViewModelTests: XCTestCase { func testSponsoredSuggestionsAreNotShownInPrivateBrowsingMode() async throws { let subject = createSubject(isPrivate: true, isBottomSearchBar: false) - engines.shouldShowFirefoxSuggestions = true - engines.shouldShowSponsoredSuggestions = true + searchEnginesManager.shouldShowFirefoxSuggestions = true + searchEnginesManager.shouldShowSponsoredSuggestions = true await subject.loadFirefoxSuggestions()?.value XCTAssertTrue(subject.firefoxSuggestions.isEmpty) @@ -187,8 +187,8 @@ final class SearchViewModelTests: XCTestCase { func testNonSponsoredSuggestionsAreNotShownInPrivateBrowsingMode() async throws { let subject = createSubject(isPrivate: true, isBottomSearchBar: false) - engines.shouldShowFirefoxSuggestions = true - engines.shouldShowSponsoredSuggestions = true + searchEnginesManager.shouldShowFirefoxSuggestions = true + searchEnginesManager.shouldShowSponsoredSuggestions = true await subject.loadFirefoxSuggestions()?.value @@ -199,9 +199,9 @@ final class SearchViewModelTests: XCTestCase { func testNonSponsoredAndSponsoredSuggestionsInPrivateModeWithPrivateSuggestionsOn() async throws { let subject = createSubject(isPrivate: true, isBottomSearchBar: false) - engines.shouldShowFirefoxSuggestions = true - engines.shouldShowSponsoredSuggestions = true - engines.shouldShowPrivateModeFirefoxSuggestions = true + searchEnginesManager.shouldShowFirefoxSuggestions = true + searchEnginesManager.shouldShowSponsoredSuggestions = true + searchEnginesManager.shouldShowPrivateModeFirefoxSuggestions = true await subject.loadFirefoxSuggestions()?.value XCTAssertTrue(subject.firefoxSuggestions.isEmpty) @@ -210,9 +210,9 @@ final class SearchViewModelTests: XCTestCase { func testNonSponsoredInPrivateModeWithPrivateSuggestionsOn() async throws { let subject = createSubject(isPrivate: true, isBottomSearchBar: false) - engines.shouldShowFirefoxSuggestions = true - engines.shouldShowSponsoredSuggestions = false - engines.shouldShowPrivateModeFirefoxSuggestions = true + searchEnginesManager.shouldShowFirefoxSuggestions = true + searchEnginesManager.shouldShowSponsoredSuggestions = false + searchEnginesManager.shouldShowPrivateModeFirefoxSuggestions = true await subject.loadFirefoxSuggestions()?.value XCTAssertTrue(subject.firefoxSuggestions.isEmpty) @@ -222,7 +222,7 @@ final class SearchViewModelTests: XCTestCase { func testNonSponsoredAndSponsoredSuggestionsAreNotShownInPrivateBrowsingMode() async throws { let subject = createSubject(isPrivate: true, isBottomSearchBar: false) - engines.shouldShowPrivateModeFirefoxSuggestions = false + searchEnginesManager.shouldShowPrivateModeFirefoxSuggestions = false await subject.loadFirefoxSuggestions()?.value XCTAssertTrue(subject.firefoxSuggestions.isEmpty) @@ -235,8 +235,8 @@ final class SearchViewModelTests: XCTestCase { [.amp: false, .ampMobile: true, .wikipedia: true]) }) - engines.shouldShowFirefoxSuggestions = true - engines.shouldShowSponsoredSuggestions = true + searchEnginesManager.shouldShowFirefoxSuggestions = true + searchEnginesManager.shouldShowSponsoredSuggestions = true let subject = createSubject() await subject.loadFirefoxSuggestions()?.value await subject.loadFirefoxSuggestions()?.value @@ -246,7 +246,7 @@ final class SearchViewModelTests: XCTestCase { } func testLoad_forHistoryAndBookmarks_doesNotTriggerReloadForSameSuggestions() async throws { - engines.shouldShowSponsoredSuggestions = false + searchEnginesManager.shouldShowSponsoredSuggestions = false let subject = createSubject() XCTAssertEqual(subject.delegate?.searchData.count, 0) let data = ArrayCursor(data: [ Site(url: "https://example.com?mfadid=adm", title: "Test1"), @@ -258,7 +258,7 @@ final class SearchViewModelTests: XCTestCase { } func testLoad_multipleTimes_doesNotTriggerReloadForSameSuggestions() async throws { - engines.shouldShowSponsoredSuggestions = false + searchEnginesManager.shouldShowSponsoredSuggestions = false let subject = createSubject() let data = ArrayCursor(data: [ Site(url: "https://example.com?mfadid=adm", title: "Test1"), Site(url: "https://example.com", title: "Test2"), @@ -275,8 +275,8 @@ final class SearchViewModelTests: XCTestCase { [.amp: false, .ampMobile: true, .wikipedia: true]) }) - engines.shouldShowFirefoxSuggestions = false - engines.shouldShowSponsoredSuggestions = true + searchEnginesManager.shouldShowFirefoxSuggestions = false + searchEnginesManager.shouldShowSponsoredSuggestions = true let subject = createSubject() await subject.loadFirefoxSuggestions()?.value @@ -290,8 +290,8 @@ final class SearchViewModelTests: XCTestCase { [.amp: false, .ampMobile: true, .wikipedia: true]) }) - engines.shouldShowFirefoxSuggestions = true - engines.shouldShowSponsoredSuggestions = false + searchEnginesManager.shouldShowFirefoxSuggestions = true + searchEnginesManager.shouldShowSponsoredSuggestions = false let subject = createSubject() await subject.loadFirefoxSuggestions()?.value @@ -301,26 +301,26 @@ final class SearchViewModelTests: XCTestCase { func testQuickSearchEnginesWithSearchSuggestionsEnabled() { let subject = createSubject() - subject.searchEngines = engines + subject.searchEnginesManager = searchEnginesManager let quickSearchEngines = subject.quickSearchEngines let expectedEngineNames = ["BTester", "CTester", "DTester", "ETester", "FTester"] - XCTAssertEqual(subject.searchEngines?.defaultEngine?.shortName, "ATester") + XCTAssertEqual(subject.searchEnginesManager?.defaultEngine?.shortName, "ATester") XCTAssertEqual(quickSearchEngines.map { $0.shortName }, expectedEngineNames) XCTAssertEqual(quickSearchEngines.count, 5) } func testQuickSearchEnginesWithSearchSuggestionsDisabled() { - engines.shouldShowSearchSuggestions = false + searchEnginesManager.shouldShowSearchSuggestions = false let subject = createSubject() - subject.searchEngines = engines + subject.searchEnginesManager = searchEnginesManager let quickSearchEngines = subject.quickSearchEngines let expectedEngineNames = ["ATester", "BTester", "CTester", "DTester", "ETester", "FTester"] XCTAssertEqual(quickSearchEngines.first?.shortName, "ATester") - XCTAssertEqual(subject.searchEngines?.defaultEngine?.shortName, "ATester") + XCTAssertEqual(subject.searchEnginesManager?.defaultEngine?.shortName, "ATester") XCTAssertEqual(quickSearchEngines.map { $0.shortName }, expectedEngineNames) XCTAssertEqual(quickSearchEngines.count, 6) } @@ -335,7 +335,7 @@ final class SearchViewModelTests: XCTestCase { isPrivate: isPrivate, isBottomSearchBar: isBottomSearchBar, profile: profile, - model: engines, + model: searchEnginesManager, tabManager: MockTabManager() ) subject.delegate = mockDelegate diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Toolbar/AddressToolbarContainerModelTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Toolbar/AddressToolbarContainerModelTests.swift index 53daab9d37f0..446238ef829e 100644 --- a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Toolbar/AddressToolbarContainerModelTests.swift +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Toolbar/AddressToolbarContainerModelTests.swift @@ -9,7 +9,7 @@ import XCTest class AddressToolbarContainerModelTests: XCTestCase { private var viewModel: AddressToolbarContainerModel! private var mockProfile: MockProfile! - private var engines: SearchEngines! + private var searchEnginesManager: SearchEnginesManager! private let windowUUID: WindowUUID = .XCTestDefaultUUID override func setUp() { @@ -44,7 +44,7 @@ class AddressToolbarContainerModelTests: XCTestCase { windowUUID: windowUUID) let mockSearchEngineProvider = MockSearchEngineProvider() - engines = SearchEngines( + searchEnginesManager = SearchEnginesManager( prefs: mockProfile.prefs, files: mockProfile.files, engineProvider: mockSearchEngineProvider @@ -55,23 +55,23 @@ class AddressToolbarContainerModelTests: XCTestCase { super.tearDown() viewModel = nil mockProfile = nil - engines = nil + searchEnginesManager = nil } func testSearchWordFromURLWhenUrlIsNilThenSearchWordIsNil() { - XCTAssertNil(viewModel.searchTermFromURL(nil, searchEngines: engines)) + XCTAssertNil(viewModel.searchTermFromURL(nil, searchEnginesManager: searchEnginesManager)) } func testSearchWordFromURLWhenUsingGoogleSearchThenSearchWordIsCorrect() { let searchTerm = "test" let url = URL(string: "http://firefox.com/find?q=\(searchTerm)") - let result = viewModel.searchTermFromURL(url, searchEngines: engines) + let result = viewModel.searchTermFromURL(url, searchEnginesManager: searchEnginesManager) XCTAssertEqual(searchTerm, result) } func testSearchWordFromURLWhenUsingInternalUrlThenSearchWordIsNil() { let searchTerm = "test" let url = URL(string: "internal://local?q=\(searchTerm)") - XCTAssertNil(viewModel.searchTermFromURL(url, searchEngines: engines)) + XCTAssertNil(viewModel.searchTermFromURL(url, searchEnginesManager: searchEnginesManager)) } } diff --git a/firefox-ios/firefox-ios-tests/Tests/XCUITests/CreditCardsTests.swift b/firefox-ios/firefox-ios-tests/Tests/XCUITests/CreditCardsTests.swift index 6e8fbbeef9a1..8f69b79bc796 100644 --- a/firefox-ios/firefox-ios-tests/Tests/XCUITests/CreditCardsTests.swift +++ b/firefox-ios/firefox-ios-tests/Tests/XCUITests/CreditCardsTests.swift @@ -134,27 +134,22 @@ class CreditCardsTests: BaseTestCase { } XCTAssertEqual(saveAndFillPaymentMethodsSwitch.value! as! String, "0") app.buttons[creditCardsStaticTexts.AutoFillCreditCard.addCard].tap() - addCreditCard(name: "Test", cardNumber: cards[0], expirationDate: "0540") + let dateFiveYearsFromNow = Calendar.current.date(byAdding: .year, value: 5, to: Date()) + let formatter = DateFormatter() + formatter.dateFormat = "MMyy" + let futureExpiryMonthYear = formatter.string(from: dateFiveYearsFromNow!) + addCreditCard(name: "Test", cardNumber: cards[0], expirationDate: futureExpiryMonthYear) if #available(iOS 16, *) { navigator.goto(NewTabScreen) // Not working on iOS 15 - navigator.openURL("https://checkout.stripe.dev/preview") + navigator.openURL("https://mozilla.github.io/form-fill-examples/basic_cc.html") waitUntilPageLoad() // The autofill option (Use saved card prompt) is not displayed - let cardNumber = app.webViews["Web content"].textFields["Card number"] - app.swipeUp() - app.swipeUp() - mozWaitForElementToExist(cardNumber) - if !cardNumber.isHittable { - swipeUp(nrOfSwipes: 2) - } - cardNumber.tapOnApp() - let menuButton = AccessibilityIdentifiers.Toolbar.settingsMenuButton - if !app.buttons[menuButton].isHittable { - cardNumber.tapOnApp() - } + let cardNumber = app.webViews["Web content"].textFields["Card Number:"] + cardNumber.waitAndTap() mozWaitForElementToNotExist(app.buttons[useSavedCard]) - dismissSavedCardsPrompt() - swipeDown(nrOfSwipes: 3) + // If Keyboard is open, hit return button + let keyboardReturn = app.keyboards.buttons["return"] + if keyboardReturn.waitForExistence(timeout: 5) { keyboardReturn.tap() } navigator.goto(CreditCardsSettings) unlockLoginsView() mozWaitForElementToExist(app.staticTexts[creditCardsStaticTexts.AutoFillCreditCard.autoFillCreditCards]) @@ -165,13 +160,10 @@ class CreditCardsTests: BaseTestCase { navigator.nowAt(SettingsScreen) waitForExistence(app.buttons["Done"]) app.buttons["Done"].tap() - app.swipeUp() - mozWaitForElementToExist(app.webViews["Web content"].staticTexts["Explore Checkout"], timeout: TIMEOUT) - mozWaitForElementToExist(cardNumber) - cardNumber.tapOnApp() + cardNumber.waitAndTap() // The autofill option (Use saved card prompt) is displayed - if !app.buttons[useSavedCard].exists { - app.webViews["Web content"].textFields["Full name on card"].tapOnApp() + if !app.buttons[useSavedCard].waitForExistence(timeout: 3) { + app.webViews["Web content"].staticTexts["Card Number:"].tap() } mozWaitForElementToExist(app.buttons[useSavedCard]) } diff --git a/focus-ios/Blockzilla.xcodeproj/project.pbxproj b/focus-ios/Blockzilla.xcodeproj/project.pbxproj index 11453ae3eabb..82b3e6916fbd 100644 --- a/focus-ios/Blockzilla.xcodeproj/project.pbxproj +++ b/focus-ios/Blockzilla.xcodeproj/project.pbxproj @@ -7168,7 +7168,7 @@ repositoryURL = "https://github.com/mozilla/rust-components-swift"; requirement = { kind = exactVersion; - version = 133.0.20241022050402; + version = 133.0.20241027050311; }; }; 8A0E7F2C2BA0F0E0006BC6B6 /* XCRemoteSwiftPackageReference "Fuzi" */ = { diff --git a/focus-ios/Blockzilla.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/focus-ios/Blockzilla.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index b8d613bed73c..8416ff4b5cc5 100644 --- a/focus-ios/Blockzilla.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/focus-ios/Blockzilla.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -51,8 +51,8 @@ "repositoryURL": "https://github.com/mozilla/rust-components-swift", "state": { "branch": null, - "revision": "89084ef67f53473c5312b9cafd5e9bf225ef888b", - "version": "133.0.20241022050402" + "revision": "e891a641517fc8c76097e33a77b3e92818fc5656", + "version": "133.0.20241027050311" } }, {