diff --git a/android-components b/android-components index 81883d4e4f0f..a2934ef2d891 160000 --- a/android-components +++ b/android-components @@ -1 +1 @@ -Subproject commit 81883d4e4f0f81a00b67875a5f592480b898f3ce +Subproject commit a2934ef2d89153e3f7842dcfe71fa81af9888d68 diff --git a/app/build.gradle b/app/build.gradle index 2d47e3a7be35..8c9b9ee4059d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -198,6 +198,7 @@ android { buildFeatures { viewBinding true + buildConfig true } androidResources { @@ -273,6 +274,9 @@ android { excludes += ['META-INF/atomicfu.kotlin_module', 'META-INF/AL2.0', 'META-INF/LGPL2.1', 'META-INF/LICENSE.md', 'META-INF/LICENSE-notice.md'] } + jniLibs { + useLegacyPackaging true + } } @@ -780,14 +784,14 @@ if (project.hasProperty("coverage")) { def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*', '**/*$[0-9].*'] - def kotlinDebugTree = fileTree(dir: "$project.buildDir/tmp/kotlin-classes/${variant.name}", excludes: fileFilter) - def javaDebugTree = fileTree(dir: "$project.buildDir/intermediates/classes/${variant.flavorName}/${variant.buildType.name}", + def kotlinDebugTree = fileTree(dir: "$project.layout.buildDirectory/tmp/kotlin-classes/${variant.name}", excludes: fileFilter) + def javaDebugTree = fileTree(dir: "$project.layout.buildDirectory/intermediates/classes/${variant.flavorName}/${variant.buildType.name}", excludes: fileFilter) def mainSrc = "$project.projectDir/src/main/java" sourceDirectories.setFrom(files([mainSrc])) classDirectories.setFrom(files([kotlinDebugTree, javaDebugTree])) - executionData.setFrom(fileTree(dir: project.buildDir, includes: [ + executionData.setFrom(fileTree(dir: project.layout.buildDirectory, includes: [ "jacoco/test${variant.name.capitalize()}UnitTest.exec", 'outputs/code-coverage/connected/*coverage.ec' ])) diff --git a/app/messaging-evergreen-messages.fml.yaml b/app/messaging-evergreen-messages.fml.yaml new file mode 100644 index 000000000000..927fb8beee9f --- /dev/null +++ b/app/messaging-evergreen-messages.fml.yaml @@ -0,0 +1,52 @@ +# 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/. +--- +# This file configures "evergreen" messages that are displayed via +# the Nimbus Messaging system. +# +# They are "evergreen" in that they apply to all users, and shipped with the app. +# +# This file is intended to grow new messages once messages have been tested via +# experiment, rolled out to everyone in the release, and are ready to be rolled out +# without the remote prompting from Experimenter. +# +# When adding new messages to this file, please add the experiment (and/or rollout) URLs used to +# validate them. +# +# Triggers, actions and styles are configured in messaging-fenix.fml.yaml. +import: + - path: ../android-components/components/service/nimbus/messaging.fml.yaml + channel: release + features: + messaging: + # This message displays on the homescreen, asking the user to set Firefox as the default. + # It is triggered after a minimum of 4 launches of the app. + - value: + messages: + default-browser: + text: default_browser_experiment_card_text + surface: homescreen + action: "MAKE_DEFAULT_BROWSER" + trigger: + - I_AM_NOT_DEFAULT_BROWSER + - USER_ESTABLISHED_INSTALL + style: PERSISTENT + button-label: preferences_set_as_default_browser + + triggers: + USER_ESTABLISHED_INSTALL: "number_of_app_launches >=4" + + # This message displays as a 'push' notification, asking the user to set Firefox as the default. + # It is triggered three days after install. + - value: + messages: + default-browser-notification: + title: nimbus_notification_default_browser_title + text: nimbus_notification_default_browser_text + surface: notification + style: NOTIFICATION + trigger: + - I_AM_NOT_DEFAULT_BROWSER + - DAY_3_AFTER_INSTALL + action: MAKE_DEFAULT_BROWSER diff --git a/app/messaging-fenix.fml.yaml b/app/messaging-fenix.fml.yaml new file mode 100644 index 000000000000..c723a9fba910 --- /dev/null +++ b/app/messaging-fenix.fml.yaml @@ -0,0 +1,112 @@ +# 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/. +--- +includes: + - messaging-evergreen-messages.fml.yaml +import: + - path: ../android-components/components/service/nimbus/messaging.fml.yaml + channel: release + features: + messaging: + - value: + triggers: + # Using attributes built into the Nimbus SDK + USER_RECENTLY_INSTALLED: days_since_install < 7 + USER_RECENTLY_UPDATED: days_since_update < 7 && days_since_install != days_since_update + USER_TIER_ONE_COUNTRY: ('US' in locale || 'GB' in locale || 'CA' in locale || 'DE' in locale || 'FR' in locale) + USER_EN_SPEAKER: "'en' in locale" + USER_ES_SPEAKER: "'es' in locale" + USER_DE_SPEAKER: "'de' in locale" + USER_FR_SPEAKER: "'fr' in locale" + DEVICE_ANDROID: os == 'Android' + DEVICE_IOS: os == 'iOS' + ALWAYS: "true" + NEVER: "false" + DAY_1_AFTER_INSTALL: days_since_install == 1 + DAY_2_AFTER_INSTALL: days_since_install == 2 + DAY_3_AFTER_INSTALL: days_since_install == 3 + DAY_4_AFTER_INSTALL: days_since_install == 4 + DAY_5_AFTER_INSTALL: days_since_install == 5 + MORE_THAN_24H_SINCE_INSTALLED_OR_UPDATED: days_since_update >= 1 + + # Using custom attributes for the browser + I_AM_DEFAULT_BROWSER: "is_default_browser" + I_AM_NOT_DEFAULT_BROWSER: "is_default_browser == false" + + FUNNEL_PAID: "adjust_campaign != ''" + FUNNEL_ORGANIC: "adjust_campaign == ''" + + # Using Glean events, specific to the browser + INACTIVE_1_DAY: "'app_launched'|eventLastSeen('Hours') >= 24" + INACTIVE_2_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 2" + INACTIVE_3_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 3" + INACTIVE_4_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 4" + INACTIVE_5_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 5" + + # Has the user signed in the last 4 years + FXA_SIGNED_IN: "'sync_auth.sign_in'|eventLastSeen('Years', 0) <= 4" + FXA_NOT_SIGNED_IN: "'sync_auth.sign_in'|eventLastSeen('Years', 0) > 4" + + # https://mozilla-hub.atlassian.net/wiki/spaces/FJT/pages/11469471/Core+Active + USER_INFREQUENT: "'app_launched'|eventCountNonZero('Days', 28) >= 1 && 'app_launched'|eventCountNonZero('Days', 28) < 7" + USER_CASUAL: "'app_launched'|eventCountNonZero('Days', 28) >= 7 && 'app_launched'|eventCountNonZero('Days', 28) < 14" + USER_REGULAR: "'app_launched'|eventCountNonZero('Days', 28) >= 14 && 'app_launched'|eventCountNonZero('Days', 28) < 21" + USER_CORE_ACTIVE: "'app_launched'|eventCountNonZero('Days', 28) >= 21" + + LAUNCHED_ONCE_THIS_WEEK: "'app_launched'|eventSum('Days', 7) == 1" + + actions: + ENABLE_PRIVATE_BROWSING: ://enable_private_browsing + INSTALL_SEARCH_WIDGET: ://install_search_widget + MAKE_DEFAULT_BROWSER: ://make_default_browser + VIEW_BOOKMARKS: ://urls_bookmarks + VIEW_COLLECTIONS: ://home_collections + VIEW_HISTORY: ://urls_history + VIEW_HOMESCREEN: ://home + OPEN_SETTINGS_ACCESSIBILITY: ://settings_accessibility + OPEN_SETTINGS_ADDON_MANAGER: ://settings_addon_manager + OPEN_SETTINGS_DELETE_BROWSING_DATA: ://settings_delete_browsing_data + OPEN_SETTINGS_LOGINS: ://settings_logins + OPEN_SETTINGS_NOTIFICATIONS: ://settings_notifications + OPEN_SETTINGS_PRIVACY: ://settings_privacy + OPEN_SETTINGS_SEARCH_ENGINE: ://settings_search_engine + OPEN_SETTINGS_TRACKING_PROTECTION: ://settings_tracking_protection + OPEN_SETTINGS_WALLPAPERS: ://settings_wallpapers + OPEN_SETTINGS: ://settings + TURN_ON_SYNC: ://turn_on_sync + styles: + DEFAULT: + priority: 50 + max-display-count: 5 + SURVEY: + priority: 55 + max-display-count: 1 + PERSISTENT: + priority: 50 + max-display-count: 20 + WARNING: + priority: 60 + max-display-count: 10 + URGENT: + priority: 100 + max-display-count: 10 + NOTIFICATION: + priority: 50 + max-display-count: 1 + $$surfaces: + - homescreen + - notification + - survey + + - channel: developer + value: + styles: + DEFAULT: + priority: 50 + max-display-count: 100 + EXPIRES_QUICKLY: + priority: 100 + max-display-count: 1 + notification-config: + refresh-interval: 120 # minutes (2 hours) diff --git a/app/metrics.yaml b/app/metrics.yaml index 140f36711600..e49a8508e38d 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -376,6 +376,27 @@ events: metadata: tags: - PrivateBrowsing + opened_ext_pdf: + type: event + description: | + A user opened a PDF with Fenix from another app + extra_keys: + referrer_is_fenix: + description: | + If the PDF was opened from Fenix itself (for example from the Download notification) + type: boolean + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1871548 + data_reviews: + - https://github.com/mozilla-mobile/firefox-android/pull/4940 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + - mcastelluccio@mozilla.com + - calixte@mozilla.com + - sylvestre@mozilla.com + expires: never synced_tab_opened: type: event description: | @@ -468,6 +489,39 @@ events: notification_emails: - android-probes@mozilla.com expires: never + browser_toolbar_qr_scan_tapped: + type: event + description: | + An event that indicates that a user has tapped + QR scan button on browser toolbar. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1862096 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1862096 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: never + metadata: + tags: + - Toolbar + toolbar_tab_swipe: + type: event + description: | + A user swiped the toolbar to change the current tab. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1862096 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1862096 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: never + metadata: + tags: + - Toolbar tab_view_changed: type: event description: | @@ -1033,7 +1087,7 @@ onboarding: set_to_default_card: type: event description: | - User viewed juno onboarding set to default card. + User viewed onboarding set to default card. extra_keys: element_type: type: string @@ -1067,7 +1121,7 @@ onboarding: sign_in_card: type: event description: | - User viewed juno onboarding sign in card. + User viewed onboarding sign in card. extra_keys: element_type: type: string @@ -1101,7 +1155,7 @@ onboarding: turn_on_notifications_card: type: event description: | - User viewed juno onboarding notification permission card. + User viewed onboarding notification permission card. extra_keys: element_type: type: string @@ -1135,7 +1189,7 @@ onboarding: set_to_default: type: event description: | - User tapped on set to default button in juno onboarding. + User tapped on set to default button in onboarding. extra_keys: element_type: type: string @@ -1169,7 +1223,7 @@ onboarding: skip_default: type: event description: | - User tapped on skip set to default button in juno onboarding. + User tapped on skip set to default button in onboarding. extra_keys: element_type: type: string @@ -1203,7 +1257,7 @@ onboarding: sign_in: type: event description: | - User tapped on sign in button in juno onboarding. + User tapped on sign in button in onboarding. extra_keys: element_type: type: string @@ -1237,7 +1291,7 @@ onboarding: skip_sign_in: type: event description: | - User tapped on skip sign in button in juno onboarding. + User tapped on skip sign in button in onboarding. extra_keys: element_type: type: string @@ -1271,7 +1325,7 @@ onboarding: turn_on_notifications: type: event description: | - User tapped on turn on notifications button in juno onboarding. + User tapped on turn on notifications button in onboarding. extra_keys: element_type: type: string @@ -1305,7 +1359,7 @@ onboarding: skip_turn_on_notifications: type: event description: | - User tapped on skip turn on notification button in juno onboarding. + User tapped on skip turn on notification button in onboarding. extra_keys: element_type: type: string @@ -1339,7 +1393,7 @@ onboarding: add_search_widget_card: type: event description: | - User viewed juno onboarding add search widget card. + User viewed onboarding add search widget card. extra_keys: element_type: type: string @@ -1373,7 +1427,7 @@ onboarding: add_search_widget: type: event description: | - User tapped on Add Firefox Widget in juno onboarding. + User tapped on Add Firefox Widget in onboarding. extra_keys: element_type: type: string @@ -1407,7 +1461,7 @@ onboarding: skip_add_search_widget: type: event description: | - User tapped on skip add search widget button in juno onboarding. + User tapped on skip add search widget button in onboarding. extra_keys: element_type: type: string @@ -1441,7 +1495,7 @@ onboarding: privacy_policy: type: event description: | - User tapped on privacy policy link in juno onboarding. + User tapped on privacy policy link in onboarding. extra_keys: element_type: type: string @@ -1475,7 +1529,7 @@ onboarding: completed: type: event description: | - User completed the juno onboarding. + User completed onboarding. extra_keys: sequence_position: type: string @@ -2612,6 +2666,25 @@ metrics: metadata: tags: - Experiments + font_list_json: + type: text + lifetime: ping + description: | + A JSON blob representing the installed fonts + send_in_pings: + - font-list + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1858193 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1858193#c2 + data_sensitivity: + # Text metrics are _required_ to be web_activity or highly_sensitive, so even though this + # is more like 'technical' (per the Data Review), I'm marking highly sensitive. + - highly_sensitive + notification_emails: + - android-probes@mozilla.com + - tom@mozilla.com + expires: 124 customize_home: most_visited_sites: @@ -9088,6 +9161,104 @@ awesomebar: metadata: tags: - Search + sponsored_suggestion_clicked: + type: event + description: | + A sponsored suggestion in the awesomebar was clicked. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1871156 + data_reviews: + - https://github.com/mozilla-mobile/firefox-android/pull/4914#issuecomment-1874271848 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + - lina@mozilla.com + - ttran@mozilla.com + - najiang@mozilla.com + expires: never + extra_keys: + provider: &sponsored_suggestion_provider + description: | + The provider of the sponsored suggestion. Possible values: `amp` (for adMarketplace + suggestions). + type: string + metadata: + tags: + - Search + non_sponsored_suggestion_clicked: + type: event + description: | + A non-sponsored suggestion in the awesomebar was clicked. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1871156 + data_reviews: + - https://github.com/mozilla-mobile/firefox-android/pull/4914#issuecomment-1874271848 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + - lina@mozilla.com + - ttran@mozilla.com + - najiang@mozilla.com + expires: never + extra_keys: + provider: &non_sponsored_suggestion_provider + description: | + The provider of the non-sponsored suggestion. Possible values: `wikipedia`. + type: string + metadata: + tags: + - Search + sponsored_suggestion_impressed: + type: event + description: | + A sponsored suggestion was visible when the user finished interacting with the awesomebar. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1871156 + data_reviews: + - https://github.com/mozilla-mobile/firefox-android/pull/4914#issuecomment-1874271848 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + - lina@mozilla.com + - ttran@mozilla.com + - najiang@mozilla.com + expires: never + extra_keys: + provider: *sponsored_suggestion_provider + engagement_abandoned: &awesomebar_engagement_abandoned + description: | + If `true`, the user dismissed the awesomebar without navigating to a destination. If + `false`, the user finished engaging with the awesomebar by navigating to a destination, + like a URL, a search results page, or a suggestion. + type: boolean + metadata: + tags: + - Search + non_sponsored_suggestion_impressed: + type: event + description: | + A non-sponsored suggestion was visible when the user finished interacting with the awesomebar. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1871156 + data_reviews: + - https://github.com/mozilla-mobile/firefox-android/pull/4914#issuecomment-1874271848 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + - lina@mozilla.com + - ttran@mozilla.com + - najiang@mozilla.com + expires: never + extra_keys: + provider: *non_sponsored_suggestion_provider + engagement_abandoned: *awesomebar_engagement_abandoned + metadata: + tags: + - Search android_autofill: supported: type: boolean diff --git a/app/nimbus.fml.yaml b/app/nimbus.fml.yaml index 8e535c927608..6c126dcd3036 100644 --- a/app/nimbus.fml.yaml +++ b/app/nimbus.fml.yaml @@ -14,126 +14,8 @@ channels: includes: - onboarding.fml.yaml - pbm.fml.yaml + - messaging-fenix.fml.yaml import: - - path: ../android-components/components/service/nimbus/messaging.fml.yaml - channel: release - features: - messaging: - - value: - triggers: - # Using attributes built into the Nimbus SDK - USER_RECENTLY_INSTALLED: days_since_install < 7 - USER_RECENTLY_UPDATED: days_since_update < 7 && days_since_install != days_since_update - USER_TIER_ONE_COUNTRY: ('US' in locale || 'GB' in locale || 'CA' in locale || 'DE' in locale || 'FR' in locale) - USER_EN_SPEAKER: "'en' in locale" - USER_ES_SPEAKER: "'es' in locale" - USER_DE_SPEAKER: "'de' in locale" - USER_FR_SPEAKER: "'fr' in locale" - DEVICE_ANDROID: os == 'Android' - DEVICE_IOS: os == 'iOS' - ALWAYS: "true" - NEVER: "false" - DAY_1_AFTER_INSTALL: days_since_install == 1 - DAY_2_AFTER_INSTALL: days_since_install == 2 - DAY_3_AFTER_INSTALL: days_since_install == 3 - DAY_4_AFTER_INSTALL: days_since_install == 4 - DAY_5_AFTER_INSTALL: days_since_install == 5 - MORE_THAN_24H_SINCE_INSTALLED_OR_UPDATED: days_since_update >= 1 - - # Using custom attributes for the browser - I_AM_DEFAULT_BROWSER: "is_default_browser" - I_AM_NOT_DEFAULT_BROWSER: "is_default_browser == false" - USER_ESTABLISHED_INSTALL: "number_of_app_launches >=4" - - FUNNEL_PAID: "adjust_campaign != ''" - FUNNEL_ORGANIC: "adjust_campaign == ''" - - # Using Glean events, specific to the browser - INACTIVE_1_DAY: "'app_launched'|eventLastSeen('Hours') >= 24" - INACTIVE_2_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 2" - INACTIVE_3_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 3" - INACTIVE_4_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 4" - INACTIVE_5_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 5" - - # Has the user signed in the last 4 years - FXA_SIGNED_IN: "'sync_auth.sign_in'|eventLastSeen('Years', 0) <= 4" - FXA_NOT_SIGNED_IN: "'sync_auth.sign_in'|eventLastSeen('Years', 0) > 4" - - # https://mozilla-hub.atlassian.net/wiki/spaces/FJT/pages/11469471/Core+Active - USER_INFREQUENT: "'app_launched'|eventCountNonZero('Days', 28) >= 1 && 'app_launched'|eventCountNonZero('Days', 28) < 7" - USER_CASUAL: "'app_launched'|eventCountNonZero('Days', 28) >= 7 && 'app_launched'|eventCountNonZero('Days', 28) < 14" - USER_REGULAR: "'app_launched'|eventCountNonZero('Days', 28) >= 14 && 'app_launched'|eventCountNonZero('Days', 28) < 21" - USER_CORE_ACTIVE: "'app_launched'|eventCountNonZero('Days', 28) >= 21" - - LAUNCHED_ONCE_THIS_WEEK: "'app_launched'|eventSum('Days', 7) == 1" - - actions: - ENABLE_PRIVATE_BROWSING: ://enable_private_browsing - INSTALL_SEARCH_WIDGET: ://install_search_widget - MAKE_DEFAULT_BROWSER: ://make_default_browser - VIEW_BOOKMARKS: ://urls_bookmarks - VIEW_COLLECTIONS: ://home_collections - VIEW_HISTORY: ://urls_history - VIEW_HOMESCREEN: ://home - OPEN_SETTINGS_ACCESSIBILITY: ://settings_accessibility - OPEN_SETTINGS_ADDON_MANAGER: ://settings_addon_manager - OPEN_SETTINGS_DELETE_BROWSING_DATA: ://settings_delete_browsing_data - OPEN_SETTINGS_LOGINS: ://settings_logins - OPEN_SETTINGS_NOTIFICATIONS: ://settings_notifications - OPEN_SETTINGS_PRIVACY: ://settings_privacy - OPEN_SETTINGS_SEARCH_ENGINE: ://settings_search_engine - OPEN_SETTINGS_TRACKING_PROTECTION: ://settings_tracking_protection - OPEN_SETTINGS_WALLPAPERS: ://settings_wallpapers - OPEN_SETTINGS: ://settings - TURN_ON_SYNC: ://turn_on_sync - styles: - DEFAULT: - priority: 50 - max-display-count: 5 - SURVEY: - priority: 55 - max-display-count: 1 - PERSISTENT: - priority: 50 - max-display-count: 20 - WARNING: - priority: 60 - max-display-count: 10 - URGENT: - priority: 100 - max-display-count: 10 - NOTIFICATION: - priority: 50 - max-display-count: 1 - messages: - default-browser: - text: default_browser_experiment_card_text - surface: homescreen - action: "MAKE_DEFAULT_BROWSER" - trigger: [ "I_AM_NOT_DEFAULT_BROWSER","USER_ESTABLISHED_INSTALL" ] - style: PERSISTENT - button-label: preferences_set_as_default_browser - default-browser-notification: - title: nimbus_notification_default_browser_title - text: nimbus_notification_default_browser_text - surface: notification - style: NOTIFICATION - trigger: - - I_AM_NOT_DEFAULT_BROWSER - - DAY_3_AFTER_INSTALL - action: MAKE_DEFAULT_BROWSER - - - channel: developer - value: - styles: - DEFAULT: - priority: 50 - max-display-count: 100 - EXPIRES_QUICKLY: - priority: 100 - max-display-count: 1 - notification-config: - refresh-interval: 120 # minutes (2 hours) - path: ../android-components/components/browser/engine-gecko/geckoview.fml.yaml channel: release features: @@ -143,6 +25,15 @@ import: download-button: true, open-in-app-button: true } + - path: ../android-components/components/feature/fxsuggest/fxsuggest.fml.yaml + channel: release + features: + awesomebar-suggestion-provider: + - value: + available-suggestion-types: { + "amp": true, + "wikipedia": true, + } features: toolbar: @@ -278,8 +169,8 @@ features: "feature-setting-value": 0, "feature-setting-value-pbm": 0, "feature-setting-detect-only": 0, - "feature-setting-global-rules": 0, - "feature-setting-global-rules-sub-frames": 0, + "feature-setting-global-rules": 1, + "feature-setting-global-rules-sub-frames": 1, } defaults: - channel: developer @@ -289,8 +180,8 @@ features: "feature-setting-value": 0, "feature-setting-value-pbm": 1, "feature-setting-detect-only": 0, - "feature-setting-global-rules": 0, - "feature-setting-global-rules-sub-frames": 0, + "feature-setting-global-rules": 1, + "feature-setting-global-rules-sub-frames": 1, } } - channel: nightly @@ -300,8 +191,8 @@ features: "feature-setting-value": 0, "feature-setting-value-pbm": 1, "feature-setting-detect-only": 0, - "feature-setting-global-rules": 0, - "feature-setting-global-rules-sub-frames": 0, + "feature-setting-global-rules": 1, + "feature-setting-global-rules-sub-frames": 1, } } - channel: beta @@ -311,8 +202,8 @@ features: "feature-setting-value": 0, "feature-setting-value-pbm": 1, "feature-setting-detect-only": 0, - "feature-setting-global-rules": 0, - "feature-setting-global-rules-sub-frames": 0, + "feature-setting-global-rules": 1, + "feature-setting-global-rules-sub-frames": 1, } } unified-search: diff --git a/app/onboarding.fml.yaml b/app/onboarding.fml.yaml index 237a622c0d64..dcd7be764ae5 100644 --- a/app/onboarding.fml.yaml +++ b/app/onboarding.fml.yaml @@ -2,7 +2,7 @@ features: juno-onboarding: - description: A feature that shows juno onboarding flow. + description: A feature that shows the onboarding flow. variables: conditions: @@ -10,14 +10,16 @@ features: A collection of out the box conditional expressions to be used in determining whether a card should show or not. Each entry maps to a valid JEXL expression. - type: Map + type: Map + string-alias: ConditionName default: { ALWAYS: "true", NEVER: "false" } cards: description: Collection of user facing onboarding cards. - type: Map + type: Map + string-alias: OnboardingCardKey default: default-browser: card-type: default-browser @@ -109,7 +111,7 @@ objects: # This should never be defaulted. default: "" prerequisites: - type: List + type: List description: > A list of strings corresponding to targeting expressions. The card will be shown if all expressions are `true` and if @@ -117,7 +119,7 @@ objects: if the `disqualifiers` table is empty. default: [ ALWAYS ] disqualifiers: - type: List + type: List description: > A list of strings corresponding to targeting expressions. The card will not be shown if any expression is `true`. diff --git a/app/pings.yaml b/app/pings.yaml index 24f16f8972c3..1ffe0dffb549 100644 --- a/app/pings.yaml +++ b/app/pings.yaml @@ -77,6 +77,7 @@ cookie-banner-report-site: - https://github.com/mozilla-mobile/firefox-android/pull/1298#pullrequestreview-1350344223 notification_emails: - android-probes@mozilla.com + fx-suggest: description: | A ping representing a single event occurring with or to a Firefox Suggestion. @@ -91,3 +92,15 @@ fx-suggest: - lina@mozilla.com - ttran@mozilla.com - najiang@mozilla.com + +font-list: + description: | + List of fonts installed on the user's device + include_client_id: false + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1858193 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1858193#c2 + notification_emails: + - android-probes@mozilla.com + - tom@mozilla.com diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index e870f06beff2..c6144bb78a0a 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -55,3 +55,9 @@ # Keep Android Lifecycle methods # https://bugzilla.mozilla.org/show_bug.cgi?id=1596302 -keep class androidx.lifecycle.** { *; } + +-dontwarn java.beans.BeanInfo +-dontwarn java.beans.FeatureDescriptor +-dontwarn java.beans.IntrospectionException +-dontwarn java.beans.Introspector +-dontwarn java.beans.PropertyDescriptor diff --git a/app/src/androidTest/assets/pages/global_privacy_control.html b/app/src/androidTest/assets/pages/global_privacy_control.html new file mode 100644 index 000000000000..e08df8c17ff7 --- /dev/null +++ b/app/src/androidTest/assets/pages/global_privacy_control.html @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/app/src/androidTest/assets/resources/TestTTC.ttc b/app/src/androidTest/assets/resources/TestTTC.ttc new file mode 100644 index 000000000000..a21fe89dc4c4 Binary files /dev/null and b/app/src/androidTest/assets/resources/TestTTC.ttc differ diff --git a/app/src/androidTest/assets/resources/TestTTF.ttf b/app/src/androidTest/assets/resources/TestTTF.ttf new file mode 100644 index 000000000000..e906d012d1b6 Binary files /dev/null and b/app/src/androidTest/assets/resources/TestTTF.ttf differ diff --git a/app/src/androidTest/assets/resources/TestTT_-LICENSE b/app/src/androidTest/assets/resources/TestTT_-LICENSE new file mode 100644 index 000000000000..67f5310de90e --- /dev/null +++ b/app/src/androidTest/assets/resources/TestTT_-LICENSE @@ -0,0 +1,23 @@ +From: https://raw.githubusercontent.com/fonttools/fonttools/main/LICENSE + +MIT License + +Copyright (c) 2017 Just van Rossum + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/app/src/androidTest/java/org/mozilla/fenix/components/FontParserTest.kt b/app/src/androidTest/java/org/mozilla/fenix/components/FontParserTest.kt new file mode 100644 index 000000000000..77be42c15f3a --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/components/FontParserTest.kt @@ -0,0 +1,79 @@ +package org.mozilla.fenix.components + +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals +import org.junit.Test +import org.mozilla.fenix.components.metrics.fonts.FontEnumerationWorker +import org.mozilla.fenix.components.metrics.fonts.FontParser + +class FontParserTest { + @Test + fun testSanityAssertion() { + /* + Changing the below constant causes _all_ Nightly users to send a (large) Telemetry event containing + their font information. Do not change this value unless you explicitly intend this. + */ + assertEquals(4, FontEnumerationWorker.kDesiredSubmissions) + } + + @Test + fun testFontParsing() { + val assetManager = InstrumentationRegistry.getInstrumentation().context.assets + val font1 = FontParser.parse("no-path", assetManager.open("resources/TestTTF.ttf")) + assertEquals( + "\u0000T\u0000e\u0000s\u0000t\u0000 \u0000T" + + "\u0000T\u0000F", + font1.family, + ) + assertEquals( + "\u0000V\u0000e\u0000r\u0000s\u0000i\u0000o\u0000n\u0000 \u00001\u0000." + + "\u00000\u00000\u00000", + font1.fontVersion, + ) + assertEquals( + "\u0000T\u0000e\u0000s\u0000t\u0000 \u0000T\u0000T\u0000F", + font1.fullName, + ) + assertEquals("\u0000R\u0000e\u0000g\u0000u\u0000l\u0000a\u0000r", font1.subFamily) + assertEquals( + "\u0000F\u0000o\u0000n\u0000t\u0000T\u0000o\u0000o\u0000l\u0000s\u0000:\u0000 " + + "\u0000T\u0000e\u0000s\u0000t\u0000 \u0000T\u0000T\u0000F\u0000:\u0000 \u00002\u00000\u00001\u00005", + font1.uniqueSubFamily, + ) + assertEquals( + "C4E8CE309F44A131D061D73B2580E922A7F5ECC8D7109797AC0FF58BF8723B7B", + font1.hash, + ) + assertEquals(3516272951, font1.created) + assertEquals(3573411749, font1.modified) + assertEquals(65536, font1.revision) + val font2 = FontParser.parse("no-path", assetManager.open("resources/TestTTC.ttc")) + assertEquals( + "\u0000T\u0000e\u0000s\u0000t\u0000 \u0000T" + + "\u0000T\u0000F", + font2.family, + ) + assertEquals( + "\u0000V\u0000e\u0000r\u0000s\u0000i\u0000o\u0000n\u0000 \u00001\u0000." + + "\u00000\u00000\u00000", + font2.fontVersion, + ) + assertEquals( + "\u0000T\u0000e\u0000s\u0000t\u0000 \u0000T\u0000T\u0000F", + font2.fullName, + ) + assertEquals("\u0000R\u0000e\u0000g\u0000u\u0000l\u0000a\u0000r", font1.subFamily) + assertEquals( + "\u0000F\u0000o\u0000n\u0000t\u0000T\u0000o\u0000o\u0000l\u0000s\u0000:\u0000 " + + "\u0000T\u0000e\u0000s\u0000t\u0000 \u0000T\u0000T\u0000F\u0000:\u0000 \u00002\u00000\u00001\u00005", + font2.uniqueSubFamily, + ) + assertEquals( + "A8521588045ED5F1F8B07EECAAC06ED3186C644655BFAC00DD4507CD316FBDC5", + font2.hash, + ) + assertEquals(3516272951, font2.created) + assertEquals(3573411749, font2.modified) + assertEquals(65536, font2.revision) + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/conftest.py b/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/conftest.py index 367303184185..79ad70fd2ec1 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/conftest.py +++ b/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/conftest.py @@ -67,12 +67,15 @@ def gradlewbuild(gradlewbuild_log): @pytest.fixture(name="experiment_data") def fixture_experiment_data(experiment_url): data = requests.get(experiment_url).json() - for item in data["branches"][0]["features"][0]["value"]["messages"].values(): - item["surface"] = "homescreen" - item["style"] = "URGENT" - for count, trigger in enumerate(item["trigger"]): - if "USER_EN_SPEAKER" not in trigger: - del item["trigger"][count] + branches = next(iter(data.get("branches")), None) + features = next(iter(branches.get("features")), None) + if features.get("messages"): + for item in features["value"]["messages"].values(): + item["surface"] = "homescreen" + item["style"] = "URGENT" + for count, trigger in enumerate(item["trigger"]): + if "USER_EN_SPEAKER" not in trigger: + del item["trigger"][count] return [data] diff --git a/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/generate_smoke_tests.py b/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/generate_smoke_tests.py index 3114304859ed..0998cbb49d01 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/generate_smoke_tests.py +++ b/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/generate_smoke_tests.py @@ -1,5 +1,5 @@ -from pathlib import Path import subprocess +from pathlib import Path import yaml diff --git a/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/gradlewbuild.py b/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/gradlewbuild.py index 721d4ff3fa3a..43ac14a64cf5 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/gradlewbuild.py +++ b/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/gradlewbuild.py @@ -24,7 +24,7 @@ def test(self, identifier, smoke=None): test_type = "ui" if smoke else "experimentintegration" cmd = f"adb shell am instrument -w -e class org.mozilla.fenix.{test_type}.{identifier} org.mozilla.fenix.debug.test/androidx.test.runner.AndroidJUnitRunner" # if smoke: - # cmd = f"adb shell am instrument -w -e class org.mozilla.fenix.ui.{identifier} org.mozilla.fenix.debug.test/androidx.test.runner.AndroidJUnitRunner" + # cmd = f"adb shell am instrument -w -e class org.mozilla.fenix.ui.{identifier} org.mozilla.fenix.debug.test/androidx.test.runner.AndroidJUnitRunner" # else: # cmd = f"adb shell am instrument -w -e class org.mozilla.fenix.experimentintegration.{identifier} org.mozilla.fenix.debug.test/androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/tests/test_generic_scenarios.py b/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/tests/test_generic_scenarios.py index bcc841fefd2f..b20397027820 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/tests/test_generic_scenarios.py +++ b/app/src/androidTest/java/org/mozilla/fenix/experimentintegration/tests/test_generic_scenarios.py @@ -1,17 +1,25 @@ import pytest + @pytest.mark.parametrize("load_branches", [("branch")], indirect=True) -def test_experiment_unenrolls_via_studies_toggle(setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment): +def test_experiment_unenrolls_via_studies_toggle( + setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment +): setup_experiment(load_branches) gradlewbuild.test("GenericExperimentIntegrationTest#disableStudiesViaStudiesToggle") assert check_ping_for_experiment(reason="enrollment", branch=load_branches[0]) gradlewbuild.test("GenericExperimentIntegrationTest#testExperimentUnenrolled") assert check_ping_for_experiment(reason="unenrollment", branch=load_branches[0]) + @pytest.mark.parametrize("load_branches", [("branch")], indirect=True) -def test_experiment_unenrolls_via_secret_menu(setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment): +def test_experiment_unenrolls_via_secret_menu( + setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment +): setup_experiment(load_branches) - gradlewbuild.test("GenericExperimentIntegrationTest#testExperimentUnenrolledViaSecretMenu") + gradlewbuild.test( + "GenericExperimentIntegrationTest#testExperimentUnenrolledViaSecretMenu" + ) assert check_ping_for_experiment(reason="enrollment", branch=load_branches[0]) gradlewbuild.test("GenericExperimentIntegrationTest#testExperimentUnenrolled") assert check_ping_for_experiment(reason="unenrollment", branch=load_branches[0]) diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/AppAndSystemHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/AppAndSystemHelper.kt index 8e5be4de1533..6e0973b5c9f8 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/AppAndSystemHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/AppAndSystemHelper.kt @@ -38,8 +38,10 @@ import org.junit.Assert.assertEquals import org.mozilla.fenix.Config import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity +import org.mozilla.fenix.helpers.Constants.PackageName.PIXEL_LAUNCHER import org.mozilla.fenix.helpers.Constants.PackageName.YOUTUBE_APP import org.mozilla.fenix.helpers.Constants.TAG +import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.ext.waitNotNull import org.mozilla.fenix.helpers.idlingresource.NetworkConnectionIdlingResource @@ -295,12 +297,14 @@ object AppAndSystemHelper { ) } - fun bringAppToForeground() { - mDevice.pressRecentApps() - mDevice.findObject(UiSelector().resourceId("${TestHelper.packageName}:id/container")).waitForExists( - TestAssetHelper.waitingTime, - ) - } + /** + * Brings the app to foregorund by clicking it in the recent apps tray. + * The package name is related to the home screen experience for the Pixel phones produced by Google. + * The recent apps tray on API 30 will always display only 2 apps, even if previously were opened more. + * The index of the most recent opened app will always have index 2, meaning that the previously opened app will have index 1. + */ + fun bringAppToForeground() = + mDevice.findObject(UiSelector().index(2).packageName(PIXEL_LAUNCHER)).clickAndWaitForNewWindow(waitingTimeShort) fun verifyKeyboardVisibility(isExpectedToBeVisible: Boolean = true) { mDevice.waitForIdle() diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt index 450ef4beefbe..037331d5b69b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt @@ -22,6 +22,7 @@ object Constants { const val PHONE_APP = "com.android.dialer" const val ANDROID_SETTINGS = "com.android.settings" const val PRINT_SPOOLER = "com.android.printspooler" + const val PIXEL_LAUNCHER = "com.google.android.apps.nexuslauncher" } const val SPEECH_RECOGNITION = "android.speech.action.RECOGNIZE_SPEECH" diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt index 91522d4e589a..d638e762f634 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt @@ -146,4 +146,10 @@ object TestAssetHelper { return TestAsset(url, "", "") } + + fun getGPCTestAsset(server: MockWebServer): TestAsset { + val url = server.url("pages/global_privacy_control.html").toString().toUri()!! + + return TestAsset(url, "", "") + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/ViewVisibilityIdlingResource.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/ViewVisibilityIdlingResource.kt index c029bac0d71f..a817c691de1e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/ViewVisibilityIdlingResource.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/ViewVisibilityIdlingResource.kt @@ -1,36 +1,36 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.helpers - -import android.view.View -import androidx.test.espresso.IdlingResource - -class ViewVisibilityIdlingResource( - private val view: View, - private val expectedVisibility: Int, -) : IdlingResource { - private var resourceCallback: IdlingResource.ResourceCallback? = null - private var isIdle: Boolean = false - - override fun getName(): String { - return ViewVisibilityIdlingResource::class.java.name + ":" + view.id + ":" + expectedVisibility - } - - override fun isIdleNow(): Boolean { - if (isIdle) return true - - isIdle = view.visibility == expectedVisibility - - if (isIdle) { - resourceCallback?.onTransitionToIdle() - } - - return isIdle - } - - override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) { - this.resourceCallback = callback - } -} +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.helpers + +import android.view.View +import androidx.test.espresso.IdlingResource + +class ViewVisibilityIdlingResource( + private val view: View, + private val expectedVisibility: Int, +) : IdlingResource { + private var resourceCallback: IdlingResource.ResourceCallback? = null + private var isIdle: Boolean = false + + override fun getName(): String { + return ViewVisibilityIdlingResource::class.java.name + ":" + view.id + ":" + expectedVisibility + } + + override fun isIdleNow(): Boolean { + if (isIdle) return true + + isIdle = view.visibility == expectedVisibility + + if (isIdle) { + resourceCallback?.onTransitionToIdle() + } + + return isIdle + } + + override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) { + this.resourceCallback = callback + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/onboarding/view/JunoOnboardingMapperTest.kt b/app/src/androidTest/java/org/mozilla/fenix/onboarding/view/OnboardingMapperTest.kt similarity index 99% rename from app/src/androidTest/java/org/mozilla/fenix/onboarding/view/JunoOnboardingMapperTest.kt rename to app/src/androidTest/java/org/mozilla/fenix/onboarding/view/OnboardingMapperTest.kt index 0807c57848ec..ac48f485ee4a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/onboarding/view/JunoOnboardingMapperTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/onboarding/view/OnboardingMapperTest.kt @@ -20,7 +20,7 @@ import org.mozilla.fenix.nimbus.JunoOnboarding import org.mozilla.fenix.nimbus.OnboardingCardData import org.mozilla.fenix.nimbus.OnboardingCardType -class JunoOnboardingMapperTest { +class OnboardingMapperTest { @get:Rule val activityTestRule = diff --git a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock index 0df52492d805..3e3d538a01cc 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock +++ b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock @@ -196,32 +196,33 @@ }, "cryptography": { "hashes": [ - "sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67", - "sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311", - "sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8", - "sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13", - "sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143", - "sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f", - "sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829", - "sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd", - "sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397", - "sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac", - "sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d", - "sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a", - "sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839", - "sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e", - "sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6", - "sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9", - "sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860", - "sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca", - "sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91", - "sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d", - "sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714", - "sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb", - "sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f" + "sha256:068bc551698c234742c40049e46840843f3d98ad7ce265fd2bd4ec0d11306596", + "sha256:0f27acb55a4e77b9be8d550d762b0513ef3fc658cd3eb15110ebbcbd626db12c", + "sha256:2132d5865eea673fe6712c2ed5fb4fa49dba10768bb4cc798345748380ee3660", + "sha256:3288acccef021e3c3c10d58933f44e8602cf04dba96d9796d70d537bb2f4bbc4", + "sha256:35f3f288e83c3f6f10752467c48919a7a94b7d88cc00b0668372a0d2ad4f8ead", + "sha256:398ae1fc711b5eb78e977daa3cbf47cec20f2c08c5da129b7a296055fbb22aed", + "sha256:422e3e31d63743855e43e5a6fcc8b4acab860f560f9321b0ee6269cc7ed70cc3", + "sha256:48783b7e2bef51224020efb61b42704207dde583d7e371ef8fc2a5fb6c0aabc7", + "sha256:4d03186af98b1c01a4eda396b137f29e4e3fb0173e30f885e27acec8823c1b09", + "sha256:5daeb18e7886a358064a68dbcaf441c036cbdb7da52ae744e7b9207b04d3908c", + "sha256:60e746b11b937911dc70d164060d28d273e31853bb359e2b2033c9e93e6f3c43", + "sha256:742ae5e9a2310e9dade7932f9576606836ed174da3c7d26bc3d3ab4bd49b9f65", + "sha256:7e00fb556bda398b99b0da289ce7053639d33b572847181d6483ad89835115f6", + "sha256:85abd057699b98fce40b41737afb234fef05c67e116f6f3650782c10862c43da", + "sha256:8efb2af8d4ba9dbc9c9dd8f04d19a7abb5b49eab1f3694e7b5a16a5fc2856f5c", + "sha256:ae236bb8760c1e55b7a39b6d4d32d2279bc6c7c8500b7d5a13b6fb9fc97be35b", + "sha256:afda76d84b053923c27ede5edc1ed7d53e3c9f475ebaf63c68e69f1403c405a8", + "sha256:b27a7fd4229abef715e064269d98a7e2909ebf92eb6912a9603c7e14c181928c", + "sha256:b648fe2a45e426aaee684ddca2632f62ec4613ef362f4d681a9a6283d10e079d", + "sha256:c5a550dc7a3b50b116323e3d376241829fd326ac47bc195e04eb33a8170902a9", + "sha256:da46e2b5df770070412c46f87bac0849b8d685c5f2679771de277a422c7d0b86", + "sha256:f39812f70fc5c71a15aa3c97b2bbe213c3f2a460b79bd21c40d033bb34a9bf36", + "sha256:ff369dd19e8fe0528b02e8df9f2aeb2479f89b1270d90f96a63500afe9af5cae" ], + "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==41.0.4" + "version": "==41.0.6" }, "distro": { "hashes": [ diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeHomeScreenTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeHomeScreenTest.kt index a7d9f7ae03f1..e6930672a92e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeHomeScreenTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeHomeScreenTest.kt @@ -155,6 +155,7 @@ class ComposeHomeScreenTest { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.goToHomescreen { }.openCustomizeHomepage { + clickShortcutsButton() clickJumpBackInButton() clickRecentBookmarksButton() clickRecentSearchesButton() @@ -163,7 +164,7 @@ class ComposeHomeScreenTest { verifyCustomizeHomepageButton(false) }.openThreeDotMenu { }.openCustomizeHome { - clickJumpBackInButton() + clickShortcutsButton() }.goBackToHomeScreen { verifyCustomizeHomepageButton(true) } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSettingsDeleteBrowsingDataTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSettingsDeleteBrowsingDataTest.kt index 6235c8f8fc4b..49c809a7c25d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSettingsDeleteBrowsingDataTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSettingsDeleteBrowsingDataTest.kt @@ -225,6 +225,10 @@ class ComposeSettingsDeleteBrowsingDataTest { selectOnlyCookiesCheckBox() clickDeleteBrowsingDataButton() verifyDeleteBrowsingDataDialog() + clickDialogCancelButton() + verifyCookiesCheckBox(status = true) + clickDeleteBrowsingDataButton() + verifyDeleteBrowsingDataDialog() confirmDeletionAndAssertSnackbar() exitMenu() } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/CreditCardAutofillTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/CreditCardAutofillTest.kt index 88a78ed614e7..f9eb0891b377 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/CreditCardAutofillTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/CreditCardAutofillTest.kt @@ -7,7 +7,6 @@ package org.mozilla.fenix.ui import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -369,7 +368,6 @@ class CreditCardAutofillTest { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1512794 - @Ignore("Failing, see https://bugzilla.mozilla.org/show_bug.cgi?id=1853625") @Test fun verifyMultipleCreditCardsCanBeAddedTest() { val creditCardFormPage = TestAssetHelper.getCreditCardFormAsset(mockWebServer) @@ -576,7 +574,6 @@ class CreditCardAutofillTest { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1512791 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1854566") @Test fun verifyCreditCardRedirectionsToAutofillSectionAfterInterruptionTest() { homeScreen { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt index c7832211dd6d..b014dbb6156e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt @@ -13,7 +13,6 @@ import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.IntentReceiverActivity @@ -141,7 +140,6 @@ class CustomTabsTest { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2334761 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1807289") @SmokeTest @Test fun verifyDownloadInACustomTabTest() { @@ -311,6 +309,7 @@ class CustomTabsTest { verifyEnhancedTrackingProtectionSheetStatus(status = "ON", state = true) }.toggleEnhancedTrackingProtectionFromSheet { verifyEnhancedTrackingProtectionSheetStatus(status = "OFF", state = false) + }.closeEnhancedTrackingProtectionSheet { } openAppFromExternalLink(customTabPage.url.toString()) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt index d49e99dd34ba..b5ca7b109eb5 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt @@ -137,7 +137,7 @@ class DownloadTest { @Test fun pauseResumeCancelDownloadTest() { downloadRobot { - openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "1GB.zip") + openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "3GB.zip") } mDevice.openNotification() notificationShade { @@ -147,7 +147,7 @@ class DownloadTest { verifySystemNotificationExists("Download paused") clickDownloadNotificationControlButton("RESUME") clickDownloadNotificationControlButton("CANCEL") - verifySystemNotificationDoesNotExist("1GB.zip") + verifySystemNotificationDoesNotExist("3GB.zip") mDevice.pressBack() } browserScreen { @@ -260,11 +260,10 @@ class DownloadTest { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/457112 - @Ignore("Failing: https://bugzilla.mozilla.org/show_bug.cgi?id=1840994") @Test fun systemNotificationCantBeDismissedWhileInProgressTest() { downloadRobot { - openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "1GB.zip") + openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "3GB.zip") } browserScreen { }.openNotificationShade { @@ -306,7 +305,7 @@ class DownloadTest { homeScreen { }.togglePrivateBrowsingMode() downloadRobot { - openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "1GB.zip") + openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "3GB.zip") } browserScreen { }.openTabDrawer { @@ -326,7 +325,7 @@ class DownloadTest { homeScreen { }.togglePrivateBrowsingMode() downloadRobot { - openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "1GB.zip") + openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "3GB.zip") } browserScreen { }.openTabDrawer { @@ -367,7 +366,7 @@ class DownloadTest { // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/244125 @Test fun restartDownloadFromAppNotificationAfterConnectionIsInterruptedTest() { - downloadFile = "1GB.zip" + downloadFile = "3GB.zip" navigationToolbar { }.enterURLAndEnterToBrowser(downloadTestPage.toUri()) { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt index 168ac36c47d7..eabf00b6ef39 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt @@ -80,6 +80,8 @@ class EnhancedTrackingProtectionTest { verifyEnhancedTrackingProtectionLevelSelected("Standard (default)", true) verifyStandardOptionDescription() verifyStrictOptionDescription() + verifyGPCTextWithSwitchWidget() + verifyGPCSwitchEnabled(false) selectTrackingProtectionOption("Custom") verifyCustomTrackingProtectionSettings() scrollToElementByText("Standard (default)") diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/FirefoxSuggestTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/FirefoxSuggestTest.kt new file mode 100644 index 000000000000..8d9cef7d4c02 --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/FirefoxSuggestTest.kt @@ -0,0 +1,194 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui + +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.customannotations.SmokeTest +import org.mozilla.fenix.ext.settings +import org.mozilla.fenix.helpers.AppAndSystemHelper +import org.mozilla.fenix.helpers.HomeActivityTestRule +import org.mozilla.fenix.helpers.TestHelper +import org.mozilla.fenix.ui.robots.navigationToolbar + +/** + * Tests for verifying the Firefox suggest search fragment + * + */ + +class FirefoxSuggestTest { + @get:Rule + val activityTestRule = AndroidComposeTestRule( + HomeActivityTestRule( + skipOnboarding = true, + isPocketEnabled = false, + isJumpBackInCFREnabled = false, + isRecentTabsFeatureEnabled = false, + isTCPCFREnabled = false, + isWallpaperOnboardingEnabled = false, + tabsTrayRewriteEnabled = false, + ), + ) { it.activity } + + // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2348361 + @SmokeTest + @Test + fun verifyFirefoxSuggestSponsoredSearchResultsTest() { + AppAndSystemHelper.runWithCondition(TestHelper.appContext.settings().enableFxSuggest) { + navigationToolbar { + }.clickUrlbar { + typeSearch(searchTerm = "Amazon") + verifySearchEngineSuggestionResults( + rule = activityTestRule, + searchSuggestions = arrayOf( + "Firefox Suggest", + "Amazon.com - Official Site", + "Sponsored", + ), + searchTerm = "Amazon", + ) + } + } + } + + // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2348362 + @Test + fun verifyFirefoxSuggestSponsoredSearchResultsWithPartialKeywordTest() { + AppAndSystemHelper.runWithCondition(TestHelper.appContext.settings().enableFxSuggest) { + navigationToolbar { + }.clickUrlbar { + typeSearch(searchTerm = "Amaz") + verifySearchEngineSuggestionResults( + rule = activityTestRule, + searchSuggestions = arrayOf( + "Firefox Suggest", + "Amazon.com - Official Site", + "Sponsored", + ), + searchTerm = "Amaz", + ) + } + } + } + + // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2348363 + @Test + fun openFirefoxSuggestSponsoredSearchResultsTest() { + AppAndSystemHelper.runWithCondition(TestHelper.appContext.settings().enableFxSuggest) { + navigationToolbar { + }.clickUrlbar { + typeSearch(searchTerm = "Amazon") + verifySearchEngineSuggestionResults( + rule = activityTestRule, + searchSuggestions = arrayOf( + "Firefox Suggest", + "Amazon.com - Official Site", + "Sponsored", + ), + searchTerm = "Amazon", + ) + }.clickSearchSuggestion("Amazon.com - Official Site") { + waitForPageToLoad() + verifyUrl( + "amazon.com/?tag=admarketus-20&ref=pd_sl_924ab4435c5a5c23aa2804307ee0669ab36f88caee841ce51d1f2ecb&mfadid=adm", + ) + verifyTabCounter("1") + } + } + } + + // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2348369 + @Test + fun verifyFirefoxSuggestSponsoredSearchResultsWithEditedKeywordTest() { + AppAndSystemHelper.runWithCondition(TestHelper.appContext.settings().enableFxSuggest) { + navigationToolbar { + }.clickUrlbar { + typeSearch(searchTerm = "Amazon") + deleteSearchKeywordCharacters(numberOfDeletionSteps = 3) + verifySearchEngineSuggestionResults( + rule = activityTestRule, + searchSuggestions = arrayOf( + "Firefox Suggest", + "Amazon.com - Official Site", + "Sponsored", + ), + searchTerm = "Amazon", + shouldEditKeyword = true, + numberOfDeletionSteps = 3, + ) + } + } + } + + // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2348374 + @SmokeTest + @Test + fun verifyFirefoxSuggestNonSponsoredSearchResultsTest() { + AppAndSystemHelper.runWithCondition(TestHelper.appContext.settings().enableFxSuggest) { + navigationToolbar { + }.clickUrlbar { + typeSearch(searchTerm = "Marvel") + verifySearchEngineSuggestionResults( + rule = activityTestRule, + searchSuggestions = arrayOf( + "Firefox Suggest", + "Wikipedia - Marvel Cinematic Universe", + ), + searchTerm = "Marvel", + ) + verifySuggestionsAreNotDisplayed( + rule = activityTestRule, + searchSuggestions = arrayOf( + "Sponsored", + ), + ) + } + } + } + + // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2348375 + @Test + fun verifyFirefoxSuggestNonSponsoredSearchResultsWithPartialKeywordTest() { + AppAndSystemHelper.runWithCondition(TestHelper.appContext.settings().enableFxSuggest) { + navigationToolbar { + }.clickUrlbar { + typeSearch(searchTerm = "Marv") + verifySearchEngineSuggestionResults( + rule = activityTestRule, + searchSuggestions = arrayOf( + "Firefox Suggest", + "Wikipedia - Marvel Cinematic Universe", + ), + searchTerm = "Marv", + ) + } + } + } + + // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2348376 + @Test + fun openFirefoxSuggestNonSponsoredSearchResultsTest() { + AppAndSystemHelper.runWithCondition(TestHelper.appContext.settings().enableFxSuggest) { + navigationToolbar { + }.clickUrlbar { + typeSearch(searchTerm = "Marvel") + verifySearchEngineSuggestionResults( + rule = activityTestRule, + searchSuggestions = arrayOf( + "Firefox Suggest", + "Wikipedia - Marvel Cinematic Universe", + ), + searchTerm = "Marvel", + ) + }.clickSearchSuggestion("Wikipedia - Marvel Cinematic Universe") { + waitForPageToLoad() + verifyUrl( + "wikipedia.org/wiki/Marvel_Cinematic_Universe", + ) + } + } + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/GlobalPrivacyControlTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/GlobalPrivacyControlTest.kt new file mode 100644 index 000000000000..25a333b5099c --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/GlobalPrivacyControlTest.kt @@ -0,0 +1,88 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui + +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.HomeActivityIntentTestRule +import org.mozilla.fenix.helpers.TestAssetHelper.TestAsset +import org.mozilla.fenix.helpers.TestAssetHelper.getGPCTestAsset +import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.navigationToolbar + +/** + * Tests for Global Privacy Control setting. + */ + +class GlobalPrivacyControlTest { + private lateinit var mockWebServer: MockWebServer + private lateinit var gpcPage: TestAsset + + @get:Rule + val activityTestRule = HomeActivityIntentTestRule( + isJumpBackInCFREnabled = false, + isTCPCFREnabled = false, + isWallpaperOnboardingEnabled = false, + skipOnboarding = true, + ) + + @Before + fun setUp() { + mockWebServer = MockWebServer().apply { + dispatcher = AndroidAssetDispatcher() + start() + } + + gpcPage = getGPCTestAsset(mockWebServer) + } + + @After + fun tearDown() { + mockWebServer.shutdown() + } + + // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2429327 + @Test + fun testGPCinNormalBrowsing() { + navigationToolbar { + }.enterURLAndEnterToBrowser(gpcPage.url) { + verifyPageContent("GPC not enabled.") + }.openThreeDotMenu { + }.openSettings { + }.openEnhancedTrackingProtectionSubMenu { + scrollToGCPSettings() + verifyGPCTextWithSwitchWidget() + verifyGPCSwitchEnabled(false) + switchGPCToggle() + }.goBack { + }.goBackToBrowser { + verifyPageContent("GPC is enabled.") + } + } + + // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2429364 + @Test + fun testGPCinPrivateBrowsing() { + homeScreen { }.togglePrivateBrowsingMode() + navigationToolbar { + }.enterURLAndEnterToBrowser(gpcPage.url) { + verifyPageContent("GPC is enabled.") + }.openThreeDotMenu { + }.openSettings { + }.openEnhancedTrackingProtectionSubMenu { + scrollToGCPSettings() + verifyGPCTextWithSwitchWidget() + verifyGPCSwitchEnabled(false) + switchGPCToggle() + }.goBack { + }.goBackToBrowser { + verifyPageContent("GPC is enabled.") + } + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt index d4d12c7b7a9c..3f3ba4d3197d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt @@ -10,7 +10,6 @@ import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -156,6 +155,7 @@ class HomeScreenTest { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.goToHomescreen { }.openCustomizeHomepage { + clickShortcutsButton() clickJumpBackInButton() clickRecentBookmarksButton() clickRecentSearchesButton() @@ -164,14 +164,13 @@ class HomeScreenTest { verifyCustomizeHomepageButton(false) }.openThreeDotMenu { }.openCustomizeHome { - clickJumpBackInButton() + clickShortcutsButton() }.goBackToHomeScreen { verifyCustomizeHomepageButton(true) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/414970 - @Ignore("Failure, more details at: https://bugzilla.mozilla.org/show_bug.cgi?id=1830005") @SmokeTest @Test fun addPrivateBrowsingShortcutFromHomeScreenCFRTest() { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt index a2ec7ef4f2a9..6705fcf5c735 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt @@ -546,18 +546,6 @@ class LoginsTest { val loginPage = "https://mozilla-mobile.github.io/testapp/v2.0/loginForm.html" val originWebsite = "mozilla-mobile.github.io" - homeScreen { - }.openThreeDotMenu { - }.openSettings { - }.openLoginsAndPasswordSubMenu { - }.openSaveLoginsAndPasswordsOptions { - verifySaveLoginsOptionsView() - verifyAskToSaveRadioButton(true) - verifyNeverSaveSaveRadioButton(false) - } - - exitMenu() - navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { setPageObjectText(itemWithResId("username"), "mozilla") diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt index 9645b5db7b04..62923e2c0347 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt @@ -81,6 +81,7 @@ class SettingsAddonsTest { ) { clickInstallAddon(addonName) } + verifyAddonDownloadOverlay() verifyAddonPermissionPrompt(addonName) cancelInstallAddon() clickInstallAddon(addonName) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsDeleteBrowsingDataTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsDeleteBrowsingDataTest.kt index 8df4f3813b48..14fd12d11fce 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsDeleteBrowsingDataTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsDeleteBrowsingDataTest.kt @@ -219,6 +219,10 @@ class SettingsDeleteBrowsingDataTest { selectOnlyCookiesCheckBox() clickDeleteBrowsingDataButton() verifyDeleteBrowsingDataDialog() + clickDialogCancelButton() + verifyCookiesCheckBox(status = true) + clickDeleteBrowsingDataButton() + verifyDeleteBrowsingDataDialog() confirmDeletionAndAssertSnackbar() exitMenu() } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index 4c5a1a197396..5d75a3117528 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -321,7 +321,6 @@ class SettingsSearchTest { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2203312 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1848623") @Test fun verifyErrorMessagesForInvalidSearchEngineUrlsTest() { val customSearchEngine = object { @@ -420,7 +419,6 @@ class SettingsSearchTest { // Test running on beta/release builds in CI: // caution when making changes to it, so they don't block the builds // Goes through the settings and changes the search suggestion toggle, then verifies it changes. - @Ignore("Failing, see: https://github.com/mozilla-mobile/fenix/issues/23817") @SmokeTest @Test fun verifyShowSearchSuggestionsToggleTest() { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSitePermissionsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSitePermissionsTest.kt index 8dcfdc573c8c..3f6b5792938f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSitePermissionsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSitePermissionsTest.kt @@ -450,7 +450,6 @@ class SettingsSitePermissionsTest { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1923417 - @Ignore("Flaky, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1829889") @Test fun verifyDRMControlledContentPermissionSettingsTest() { navigationToolbar { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt index d03c36f25176..394638625504 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt @@ -15,7 +15,6 @@ import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Assume.assumeTrue import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -98,7 +97,6 @@ class SitePermissionsTest { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2334294 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1815395") @Test fun blockAudioVideoPermissionRememberingTheDecisionTest() { assumeTrue(cameraManager.cameraIdList.isNotEmpty()) @@ -122,7 +120,6 @@ class SitePermissionsTest { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/251388 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1815395") @Test fun allowAudioVideoPermissionRememberingTheDecisionTest() { assumeTrue(cameraManager.cameraIdList.isNotEmpty()) @@ -164,7 +161,6 @@ class SitePermissionsTest { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2334190 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1815395") @Test fun blockMicrophonePermissionRememberingTheDecisionTest() { assumeTrue(micManager.microphones.isNotEmpty()) @@ -187,7 +183,6 @@ class SitePermissionsTest { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/251387 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1815395") @Test fun allowMicrophonePermissionRememberingTheDecisionTest() { assumeTrue(micManager.microphones.isNotEmpty()) @@ -228,7 +223,6 @@ class SitePermissionsTest { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2334077 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1815395") @Test fun blockCameraPermissionRememberingTheDecisionTest() { assumeTrue(cameraManager.cameraIdList.isNotEmpty()) @@ -251,7 +245,6 @@ class SitePermissionsTest { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/251386 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1815395") @Test fun allowCameraPermissionRememberingTheDecisionTest() { assumeTrue(cameraManager.cameraIdList.isNotEmpty()) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTopSitesRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTopSitesRobot.kt index 16074734dbd2..0edba483d6d1 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTopSitesRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTopSitesRobot.kt @@ -13,7 +13,6 @@ import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.longClick import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onFirst -import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo import androidx.compose.ui.test.performTouchInput @@ -33,8 +32,10 @@ import org.mozilla.fenix.home.topsites.TopSitesTestTag */ class ComposeTopSitesRobot(private val composeTestRule: HomeActivityComposeTestRule) { - fun verifyExistingTopSitesList() = - composeTestRule.onNodeWithTag(TopSitesTestTag.topSites).assertExists() + @OptIn(ExperimentalTestApi::class) + fun verifyExistingTopSitesList() { + composeTestRule.waitUntilExactlyOneExists(hasTestTag(TopSitesTestTag.topSites), timeoutMillis = waitingTime) + } @OptIn(ExperimentalTestApi::class) fun verifyExistingTopSiteItem(vararg titles: String) { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt index d2ca0ce4c875..c28cc8fc1467 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.ui.robots +import android.util.Log import androidx.compose.ui.test.ComposeTimeoutException import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertAny @@ -48,6 +49,7 @@ import org.mozilla.fenix.helpers.MatcherHelper.itemWithText import org.mozilla.fenix.helpers.SessionLoadedIdlingResource import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort +import org.mozilla.fenix.helpers.TestHelper.appName import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.waitForObjects @@ -80,7 +82,13 @@ class SearchRobot { } } - fun verifySearchEngineSuggestionResults(rule: ComposeTestRule, vararg searchSuggestions: String, searchTerm: String) { + fun verifySearchEngineSuggestionResults( + rule: ComposeTestRule, + vararg searchSuggestions: String, + searchTerm: String, + shouldEditKeyword: Boolean = false, + numberOfDeletionSteps: Int = 0, + ) { rule.waitForIdle() for (i in 1..RETRY_COUNT) { try { @@ -99,6 +107,9 @@ class SearchRobot { homeScreen { }.openSearch { typeSearch(searchTerm) + if (shouldEditKeyword) { + deleteSearchKeywordCharacters(numberOfDeletionSteps = numberOfDeletionSteps) + } } } } @@ -286,6 +297,14 @@ class SearchRobot { ) } + fun deleteSearchKeywordCharacters(numberOfDeletionSteps: Int) { + for (i in 1..numberOfDeletionSteps) { + mDevice.pressDelete() + Log.i(Constants.TAG, "deleteSearchKeywordCharacters: Pressed keyboard delete button $i times") + mDevice.waitForWindowUpdate(appName, waitingTimeShort) + } + } + class Transition { private lateinit var sessionLoadedIdlingResource: SessionLoadedIdlingResource diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAddonsManagerRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAddonsManagerRobot.kt index 76de0542182a..3c73bc82a616 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAddonsManagerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAddonsManagerRobot.kt @@ -55,6 +55,9 @@ class SettingsSubMenuAddonsManagerRobot { fun verifyAddonsListIsDisplayed(shouldBeDisplayed: Boolean) = assertUIObjectExists(addonsList(), exists = shouldBeDisplayed) + fun verifyAddonDownloadOverlay() = + onView(withText(R.string.mozac_add_on_install_progress_caption)).check(matches(isDisplayed())) + fun verifyAddonPermissionPrompt(addonName: String) { mDevice.waitNotNull(Until.findObject(By.text("Add $addonName?")), waitingTime) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuDeleteBrowsingDataOnQuitRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuDeleteBrowsingDataOnQuitRobot.kt index 976e6777c89c..a818ef487f0c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuDeleteBrowsingDataOnQuitRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuDeleteBrowsingDataOnQuitRobot.kt @@ -1,119 +1,119 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.ui.robots - -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.matcher.ViewMatchers.Visibility -import androidx.test.espresso.matcher.ViewMatchers.hasDescendant -import androidx.test.espresso.matcher.ViewMatchers.withChild -import androidx.test.espresso.matcher.ViewMatchers.withClassName -import androidx.test.espresso.matcher.ViewMatchers.withContentDescription -import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility -import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withResourceName -import androidx.test.espresso.matcher.ViewMatchers.withText -import org.hamcrest.CoreMatchers.allOf -import org.hamcrest.CoreMatchers.containsString -import org.mozilla.fenix.R -import org.mozilla.fenix.helpers.assertIsChecked -import org.mozilla.fenix.helpers.atPosition -import org.mozilla.fenix.helpers.click -import org.mozilla.fenix.helpers.isChecked - -/** - * Implementation of Robot Pattern for the settings Delete Browsing Data On Quit sub menu. - */ -class SettingsSubMenuDeleteBrowsingDataOnQuitRobot { - - fun verifyNavigationToolBarHeader() = - onView( - allOf( - withId(R.id.navigationToolbar), - withChild(withText(R.string.preferences_delete_browsing_data_on_quit)), - ), - ) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - - fun verifyDeleteBrowsingOnQuitEnabled(enabled: Boolean) = - deleteBrowsingOnQuitButton.assertIsChecked(enabled) - - fun verifyDeleteBrowsingOnQuitButtonSummary() = - onView( - withText(R.string.preference_summary_delete_browsing_data_on_quit_2), - ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - - fun clickDeleteBrowsingOnQuitButtonSwitch() = onView(withResourceName("switch_widget")).click() - - fun verifyAllTheCheckBoxesText() { - openTabsCheckbox - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - - browsingHistoryCheckbox - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - - cookiesAndSiteDataCheckbox - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - - onView(withText(R.string.preferences_delete_browsing_data_cookies_subtitle)) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - - cachedFilesCheckbox - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - - onView(withText(R.string.preferences_delete_browsing_data_cached_files_subtitle)) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - - sitePermissionsCheckbox - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - } - - fun verifyAllTheCheckBoxesChecked(checked: Boolean) { - for (index in 2..7) { - onView(withId(R.id.recycler_view)) - .check( - matches( - atPosition( - index, - hasDescendant( - allOf( - withResourceName(containsString("checkbox")), - isChecked(checked), - ), - ), - ), - ), - ) - } - } - - class Transition { - fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition { - goBackButton.click() - - SettingsRobot().interact() - return SettingsRobot.Transition() - } - } -} - -private val goBackButton = onView(withContentDescription("Navigate up")) - -private val deleteBrowsingOnQuitButton = - onView(withClassName(containsString("android.widget.Switch"))) - -private val openTabsCheckbox = - onView(withText(R.string.preferences_delete_browsing_data_tabs_title_2)) - -private val browsingHistoryCheckbox = - onView(withText(R.string.preferences_delete_browsing_data_browsing_history_title)) - -private val cookiesAndSiteDataCheckbox = onView(withText(R.string.preferences_delete_browsing_data_cookies_and_site_data)) - -private val cachedFilesCheckbox = - onView(withText(R.string.preferences_delete_browsing_data_cached_files)) - -private val sitePermissionsCheckbox = - onView(withText(R.string.preferences_delete_browsing_data_site_permissions)) +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui.robots + +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.Visibility +import androidx.test.espresso.matcher.ViewMatchers.hasDescendant +import androidx.test.espresso.matcher.ViewMatchers.withChild +import androidx.test.espresso.matcher.ViewMatchers.withClassName +import androidx.test.espresso.matcher.ViewMatchers.withContentDescription +import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withResourceName +import androidx.test.espresso.matcher.ViewMatchers.withText +import org.hamcrest.CoreMatchers.allOf +import org.hamcrest.CoreMatchers.containsString +import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.assertIsChecked +import org.mozilla.fenix.helpers.atPosition +import org.mozilla.fenix.helpers.click +import org.mozilla.fenix.helpers.isChecked + +/** + * Implementation of Robot Pattern for the settings Delete Browsing Data On Quit sub menu. + */ +class SettingsSubMenuDeleteBrowsingDataOnQuitRobot { + + fun verifyNavigationToolBarHeader() = + onView( + allOf( + withId(R.id.navigationToolbar), + withChild(withText(R.string.preferences_delete_browsing_data_on_quit)), + ), + ) + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + + fun verifyDeleteBrowsingOnQuitEnabled(enabled: Boolean) = + deleteBrowsingOnQuitButton.assertIsChecked(enabled) + + fun verifyDeleteBrowsingOnQuitButtonSummary() = + onView( + withText(R.string.preference_summary_delete_browsing_data_on_quit_2), + ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + + fun clickDeleteBrowsingOnQuitButtonSwitch() = onView(withResourceName("switch_widget")).click() + + fun verifyAllTheCheckBoxesText() { + openTabsCheckbox + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + + browsingHistoryCheckbox + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + + cookiesAndSiteDataCheckbox + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + + onView(withText(R.string.preferences_delete_browsing_data_cookies_subtitle)) + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + + cachedFilesCheckbox + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + + onView(withText(R.string.preferences_delete_browsing_data_cached_files_subtitle)) + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + + sitePermissionsCheckbox + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + } + + fun verifyAllTheCheckBoxesChecked(checked: Boolean) { + for (index in 2..7) { + onView(withId(R.id.recycler_view)) + .check( + matches( + atPosition( + index, + hasDescendant( + allOf( + withResourceName(containsString("checkbox")), + isChecked(checked), + ), + ), + ), + ), + ) + } + } + + class Transition { + fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition { + goBackButton.click() + + SettingsRobot().interact() + return SettingsRobot.Transition() + } + } +} + +private val goBackButton = onView(withContentDescription("Navigate up")) + +private val deleteBrowsingOnQuitButton = + onView(withClassName(containsString("android.widget.Switch"))) + +private val openTabsCheckbox = + onView(withText(R.string.preferences_delete_browsing_data_tabs_title_2)) + +private val browsingHistoryCheckbox = + onView(withText(R.string.preferences_delete_browsing_data_browsing_history_title)) + +private val cookiesAndSiteDataCheckbox = onView(withText(R.string.preferences_delete_browsing_data_cookies_and_site_data)) + +private val cachedFilesCheckbox = + onView(withText(R.string.preferences_delete_browsing_data_cached_files)) + +private val sitePermissionsCheckbox = + onView(withText(R.string.preferences_delete_browsing_data_site_permissions)) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuEnhancedTrackingProtectionRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuEnhancedTrackingProtectionRobot.kt index 87cecddced23..a437736a7eb6 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuEnhancedTrackingProtectionRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuEnhancedTrackingProtectionRobot.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.ui.robots import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.pressBack +import androidx.test.espresso.ViewInteraction import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.contrib.RecyclerViewActions import androidx.test.espresso.matcher.ViewMatchers.Visibility @@ -33,6 +34,8 @@ import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.isChecked import org.mozilla.fenix.helpers.isEnabled +const val globalPrivacyControlSwitchText = "Tell websites not to share & sell data" + /** * Implementation of Robot Pattern for the settings Enhanced Tracking Protection sub menu. */ @@ -66,6 +69,33 @@ class SettingsSubMenuEnhancedTrackingProtectionRobot { ), ).click() + fun scrollToGCPSettings(): ViewInteraction = onView(withId(R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(globalPrivacyControlSwitchText)), + ), + ) + fun verifyGPCTextWithSwitchWidget() { + onView( + allOf( + withChild(withText(globalPrivacyControlSwitchText)), + ), + ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + } + + fun verifyGPCSwitchEnabled(enabled: Boolean) { + onView( + allOf( + withChild(withText(globalPrivacyControlSwitchText)), + ), + ).check(matches(isChecked(enabled))) + } + + fun switchGPCToggle() = onView( + allOf( + withChild(withText(globalPrivacyControlSwitchText)), + ), + ).click() + fun verifyStandardOptionDescription() { onView(withText(R.string.preference_enhanced_tracking_protection_standard_description_5)) .check(matches(isDisplayed())) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsExceptionsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsExceptionsRobot.kt index a95a24a20820..35d52c2ed2d1 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsExceptionsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsExceptionsRobot.kt @@ -1,124 +1,124 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.ui.robots - -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.matcher.ViewMatchers.hasSibling -import androidx.test.espresso.matcher.ViewMatchers.isDisplayed -import androidx.test.espresso.matcher.ViewMatchers.withContentDescription -import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withText -import androidx.test.uiautomator.UiSelector -import org.hamcrest.CoreMatchers.allOf -import org.hamcrest.CoreMatchers.containsString -import org.mozilla.fenix.R -import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource -import org.mozilla.fenix.helpers.MatcherHelper.assertUIObjectIsGone -import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText -import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime -import org.mozilla.fenix.helpers.TestHelper.mDevice -import org.mozilla.fenix.helpers.TestHelper.packageName -import org.mozilla.fenix.helpers.click - -/** - * Implementation of Robot Pattern for the settings Site Permissions Notification sub menu. - */ -class SettingsSubMenuSitePermissionsExceptionsRobot { - fun verifyExceptionsEmptyList() { - mDevice.findObject(UiSelector().text(getStringResource(R.string.no_site_exceptions))) - .waitForExists(waitingTime) - onView(withText(R.string.no_site_exceptions)).check(matches(isDisplayed())) - } - - fun verifyExceptionCreated(url: String, shouldBeDisplayed: Boolean) { - if (shouldBeDisplayed) { - exceptionsList.waitForExists(waitingTime) - onView(withText(containsString(url))).check(matches(isDisplayed())) - } else { - assertUIObjectIsGone(itemContainingText(url)) - } - } - - fun verifyClearPermissionsDialog() { - onView(withText(R.string.clear_permissions)).check(matches(isDisplayed())) - onView(withText(R.string.confirm_clear_permissions_on_all_sites)).check(matches(isDisplayed())) - onView(withText(R.string.clear_permissions_positive)).check(matches(isDisplayed())) - onView(withText(R.string.clear_permissions_negative)).check(matches(isDisplayed())) - } - - // Click button for resetting all of one site's permissions to default - fun clickClearPermissionsForOneSite() { - swipeToBottom() - onView(withText(R.string.clear_permissions)) - .check(matches(isDisplayed())) - .click() - } - fun verifyClearPermissionsForOneSiteDialog() { - onView(withText(R.string.clear_permissions)).check(matches(isDisplayed())) - onView(withText(R.string.confirm_clear_permissions_site)).check(matches(isDisplayed())) - onView(withText(R.string.clear_permissions_positive)).check(matches(isDisplayed())) - onView(withText(R.string.clear_permissions_negative)).check(matches(isDisplayed())) - } - - fun openSiteExceptionsDetails(url: String) { - exceptionsList.waitForExists(waitingTime) - onView(withText(containsString(url))).click() - } - - fun verifyPermissionSettingSummary(setting: String, summary: String) { - onView( - allOf( - withText(setting), - hasSibling(withText(summary)), - ), - ).check(matches(isDisplayed())) - } - - fun openChangePermissionSettingsMenu(permissionSetting: String) { - onView(withText(containsString(permissionSetting))).click() - } - - // Click button for resetting all permissions for all websites - fun clickClearPermissionsOnAllSites() { - exceptionsList.waitForExists(waitingTime) - onView(withId(R.id.delete_all_site_permissions_button)) - .check(matches(isDisplayed())) - .click() - } - - // Click button for resetting one site permission to default - fun clickClearOnePermissionForOneSite() { - onView(withText(R.string.clear_permission)) - .check(matches(isDisplayed())) - .click() - } - - fun verifyResetPermissionDefaultForThisSiteDialog() { - onView(withText(R.string.clear_permission)).check(matches(isDisplayed())) - onView(withText(R.string.confirm_clear_permission_site)).check(matches(isDisplayed())) - onView(withText(R.string.clear_permissions_positive)).check(matches(isDisplayed())) - onView(withText(R.string.clear_permissions_negative)).check(matches(isDisplayed())) - } - - fun clickOK() = onView(withText(R.string.clear_permissions_positive)).click() - - fun clickCancel() = onView(withText(R.string.clear_permissions_negative)).click() - - class Transition { - fun goBack(interact: SettingsSubMenuSitePermissionsRobot.() -> Unit): SettingsSubMenuSitePermissionsRobot.Transition { - goBackButton().click() - - SettingsSubMenuSitePermissionsRobot().interact() - return SettingsSubMenuSitePermissionsRobot.Transition() - } - } -} - -private fun goBackButton() = - onView(allOf(withContentDescription("Navigate up"))) - -private val exceptionsList = - mDevice.findObject(UiSelector().resourceId("$packageName:id/exceptions")) +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui.robots + +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.hasSibling +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.withContentDescription +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.uiautomator.UiSelector +import org.hamcrest.CoreMatchers.allOf +import org.hamcrest.CoreMatchers.containsString +import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource +import org.mozilla.fenix.helpers.MatcherHelper.assertUIObjectIsGone +import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText +import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime +import org.mozilla.fenix.helpers.TestHelper.mDevice +import org.mozilla.fenix.helpers.TestHelper.packageName +import org.mozilla.fenix.helpers.click + +/** + * Implementation of Robot Pattern for the settings Site Permissions Notification sub menu. + */ +class SettingsSubMenuSitePermissionsExceptionsRobot { + fun verifyExceptionsEmptyList() { + mDevice.findObject(UiSelector().text(getStringResource(R.string.no_site_exceptions))) + .waitForExists(waitingTime) + onView(withText(R.string.no_site_exceptions)).check(matches(isDisplayed())) + } + + fun verifyExceptionCreated(url: String, shouldBeDisplayed: Boolean) { + if (shouldBeDisplayed) { + exceptionsList.waitForExists(waitingTime) + onView(withText(containsString(url))).check(matches(isDisplayed())) + } else { + assertUIObjectIsGone(itemContainingText(url)) + } + } + + fun verifyClearPermissionsDialog() { + onView(withText(R.string.clear_permissions)).check(matches(isDisplayed())) + onView(withText(R.string.confirm_clear_permissions_on_all_sites)).check(matches(isDisplayed())) + onView(withText(R.string.clear_permissions_positive)).check(matches(isDisplayed())) + onView(withText(R.string.clear_permissions_negative)).check(matches(isDisplayed())) + } + + // Click button for resetting all of one site's permissions to default + fun clickClearPermissionsForOneSite() { + swipeToBottom() + onView(withText(R.string.clear_permissions)) + .check(matches(isDisplayed())) + .click() + } + fun verifyClearPermissionsForOneSiteDialog() { + onView(withText(R.string.clear_permissions)).check(matches(isDisplayed())) + onView(withText(R.string.confirm_clear_permissions_site)).check(matches(isDisplayed())) + onView(withText(R.string.clear_permissions_positive)).check(matches(isDisplayed())) + onView(withText(R.string.clear_permissions_negative)).check(matches(isDisplayed())) + } + + fun openSiteExceptionsDetails(url: String) { + exceptionsList.waitForExists(waitingTime) + onView(withText(containsString(url))).click() + } + + fun verifyPermissionSettingSummary(setting: String, summary: String) { + onView( + allOf( + withText(setting), + hasSibling(withText(summary)), + ), + ).check(matches(isDisplayed())) + } + + fun openChangePermissionSettingsMenu(permissionSetting: String) { + onView(withText(containsString(permissionSetting))).click() + } + + // Click button for resetting all permissions for all websites + fun clickClearPermissionsOnAllSites() { + exceptionsList.waitForExists(waitingTime) + onView(withId(R.id.delete_all_site_permissions_button)) + .check(matches(isDisplayed())) + .click() + } + + // Click button for resetting one site permission to default + fun clickClearOnePermissionForOneSite() { + onView(withText(R.string.clear_permission)) + .check(matches(isDisplayed())) + .click() + } + + fun verifyResetPermissionDefaultForThisSiteDialog() { + onView(withText(R.string.clear_permission)).check(matches(isDisplayed())) + onView(withText(R.string.confirm_clear_permission_site)).check(matches(isDisplayed())) + onView(withText(R.string.clear_permissions_positive)).check(matches(isDisplayed())) + onView(withText(R.string.clear_permissions_negative)).check(matches(isDisplayed())) + } + + fun clickOK() = onView(withText(R.string.clear_permissions_positive)).click() + + fun clickCancel() = onView(withText(R.string.clear_permissions_negative)).click() + + class Transition { + fun goBack(interact: SettingsSubMenuSitePermissionsRobot.() -> Unit): SettingsSubMenuSitePermissionsRobot.Transition { + goBackButton().click() + + SettingsSubMenuSitePermissionsRobot().interact() + return SettingsSubMenuSitePermissionsRobot.Transition() + } + } +} + +private fun goBackButton() = + onView(allOf(withContentDescription("Navigate up"))) + +private val exceptionsList = + mDevice.findObject(UiSelector().resourceId("$packageName:id/exceptions")) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsRobot.kt index 955fa28aa8f9..5d3948106355 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsRobot.kt @@ -1,199 +1,199 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.ui.robots - -import androidx.preference.R -import androidx.recyclerview.widget.RecyclerView -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.contrib.RecyclerViewActions -import androidx.test.espresso.matcher.ViewMatchers.Visibility -import androidx.test.espresso.matcher.ViewMatchers.hasDescendant -import androidx.test.espresso.matcher.ViewMatchers.hasSibling -import androidx.test.espresso.matcher.ViewMatchers.withContentDescription -import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility -import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withText -import org.hamcrest.CoreMatchers.allOf -import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText -import org.mozilla.fenix.helpers.click - -/** - * Implementation of Robot Pattern for the settings Site Permissions sub menu. - */ -class SettingsSubMenuSitePermissionsRobot { - - fun verifySitePermissionsToolbarTitle() = - onView(withText("Site permissions")).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - - fun verifyToolbarGoBackButton() = - goBackButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - - fun verifySitePermissionOption(option: String, summary: String = "") { - scrollToElementByText(option) - onView( - allOf( - withText(option), - hasSibling(withText(summary)), - ), - ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - } - - class Transition { - fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition { - goBackButton().click() - - SettingsRobot().interact() - return SettingsRobot.Transition() - } - - fun openAutoPlay( - interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, - ): SettingsSubMenuSitePermissionsCommonRobot.Transition { - onView(withId(R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Autoplay")), - ), - ) - - openAutoPlay().click() - - SettingsSubMenuSitePermissionsCommonRobot().interact() - return SettingsSubMenuSitePermissionsCommonRobot.Transition() - } - - fun openCamera( - interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, - ): SettingsSubMenuSitePermissionsCommonRobot.Transition { - onView(withId(R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Camera")), - ), - ) - - openCamera().click() - - SettingsSubMenuSitePermissionsCommonRobot().interact() - return SettingsSubMenuSitePermissionsCommonRobot.Transition() - } - - fun openLocation( - interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, - ): SettingsSubMenuSitePermissionsCommonRobot.Transition { - onView(withId(R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Location")), - ), - ) - - openLocation().click() - - SettingsSubMenuSitePermissionsCommonRobot().interact() - return SettingsSubMenuSitePermissionsCommonRobot.Transition() - } - - fun openMicrophone( - interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, - ): SettingsSubMenuSitePermissionsCommonRobot.Transition { - onView(withId(R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Microphone")), - ), - ) - - openMicrophone().click() - - SettingsSubMenuSitePermissionsCommonRobot().interact() - return SettingsSubMenuSitePermissionsCommonRobot.Transition() - } - - fun openNotification( - interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, - ): SettingsSubMenuSitePermissionsCommonRobot.Transition { - onView(withId(R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Notification")), - ), - ) - - openNotification().click() - - SettingsSubMenuSitePermissionsCommonRobot().interact() - return SettingsSubMenuSitePermissionsCommonRobot.Transition() - } - - fun openPersistentStorage( - interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, - ): SettingsSubMenuSitePermissionsCommonRobot.Transition { - onView(withId(R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Persistent Storage")), - ), - ) - - openPersistentStorage().click() - - SettingsSubMenuSitePermissionsCommonRobot().interact() - return SettingsSubMenuSitePermissionsCommonRobot.Transition() - } - - fun openDRMControlledContent( - interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, - ): SettingsSubMenuSitePermissionsCommonRobot.Transition { - onView(withId(R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("DRM-controlled content")), - ), - ) - - openDrmControlledContent().click() - - SettingsSubMenuSitePermissionsCommonRobot().interact() - return SettingsSubMenuSitePermissionsCommonRobot.Transition() - } - - fun openExceptions( - interact: SettingsSubMenuSitePermissionsExceptionsRobot.() -> Unit, - ): SettingsSubMenuSitePermissionsExceptionsRobot.Transition { - onView(withId(R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Exceptions")), - ), - ) - - openExceptions().click() - - SettingsSubMenuSitePermissionsExceptionsRobot().interact() - return SettingsSubMenuSitePermissionsExceptionsRobot.Transition() - } - } -} - -private fun goBackButton() = - onView(withContentDescription("Navigate up")) - -private fun openAutoPlay() = - onView(allOf(withText("Autoplay"))) - -private fun openCamera() = - onView(allOf(withText("Camera"))) - -private fun openLocation() = - onView(allOf(withText("Location"))) - -private fun openMicrophone() = - onView(allOf(withText("Microphone"))) - -private fun openNotification() = - onView(allOf(withText("Notification"))) - -private fun openPersistentStorage() = - onView(allOf(withText("Persistent Storage"))) - -private fun openDrmControlledContent() = - onView(allOf(withText("DRM-controlled content"))) - -private fun openExceptions() = - onView(allOf(withText("Exceptions"))) +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui.robots + +import androidx.preference.R +import androidx.recyclerview.widget.RecyclerView +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.contrib.RecyclerViewActions +import androidx.test.espresso.matcher.ViewMatchers.Visibility +import androidx.test.espresso.matcher.ViewMatchers.hasDescendant +import androidx.test.espresso.matcher.ViewMatchers.hasSibling +import androidx.test.espresso.matcher.ViewMatchers.withContentDescription +import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import org.hamcrest.CoreMatchers.allOf +import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText +import org.mozilla.fenix.helpers.click + +/** + * Implementation of Robot Pattern for the settings Site Permissions sub menu. + */ +class SettingsSubMenuSitePermissionsRobot { + + fun verifySitePermissionsToolbarTitle() = + onView(withText("Site permissions")).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + + fun verifyToolbarGoBackButton() = + goBackButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + + fun verifySitePermissionOption(option: String, summary: String = "") { + scrollToElementByText(option) + onView( + allOf( + withText(option), + hasSibling(withText(summary)), + ), + ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + } + + class Transition { + fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition { + goBackButton().click() + + SettingsRobot().interact() + return SettingsRobot.Transition() + } + + fun openAutoPlay( + interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, + ): SettingsSubMenuSitePermissionsCommonRobot.Transition { + onView(withId(R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Autoplay")), + ), + ) + + openAutoPlay().click() + + SettingsSubMenuSitePermissionsCommonRobot().interact() + return SettingsSubMenuSitePermissionsCommonRobot.Transition() + } + + fun openCamera( + interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, + ): SettingsSubMenuSitePermissionsCommonRobot.Transition { + onView(withId(R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Camera")), + ), + ) + + openCamera().click() + + SettingsSubMenuSitePermissionsCommonRobot().interact() + return SettingsSubMenuSitePermissionsCommonRobot.Transition() + } + + fun openLocation( + interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, + ): SettingsSubMenuSitePermissionsCommonRobot.Transition { + onView(withId(R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Location")), + ), + ) + + openLocation().click() + + SettingsSubMenuSitePermissionsCommonRobot().interact() + return SettingsSubMenuSitePermissionsCommonRobot.Transition() + } + + fun openMicrophone( + interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, + ): SettingsSubMenuSitePermissionsCommonRobot.Transition { + onView(withId(R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Microphone")), + ), + ) + + openMicrophone().click() + + SettingsSubMenuSitePermissionsCommonRobot().interact() + return SettingsSubMenuSitePermissionsCommonRobot.Transition() + } + + fun openNotification( + interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, + ): SettingsSubMenuSitePermissionsCommonRobot.Transition { + onView(withId(R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Notification")), + ), + ) + + openNotification().click() + + SettingsSubMenuSitePermissionsCommonRobot().interact() + return SettingsSubMenuSitePermissionsCommonRobot.Transition() + } + + fun openPersistentStorage( + interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, + ): SettingsSubMenuSitePermissionsCommonRobot.Transition { + onView(withId(R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Persistent Storage")), + ), + ) + + openPersistentStorage().click() + + SettingsSubMenuSitePermissionsCommonRobot().interact() + return SettingsSubMenuSitePermissionsCommonRobot.Transition() + } + + fun openDRMControlledContent( + interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit, + ): SettingsSubMenuSitePermissionsCommonRobot.Transition { + onView(withId(R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("DRM-controlled content")), + ), + ) + + openDrmControlledContent().click() + + SettingsSubMenuSitePermissionsCommonRobot().interact() + return SettingsSubMenuSitePermissionsCommonRobot.Transition() + } + + fun openExceptions( + interact: SettingsSubMenuSitePermissionsExceptionsRobot.() -> Unit, + ): SettingsSubMenuSitePermissionsExceptionsRobot.Transition { + onView(withId(R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Exceptions")), + ), + ) + + openExceptions().click() + + SettingsSubMenuSitePermissionsExceptionsRobot().interact() + return SettingsSubMenuSitePermissionsExceptionsRobot.Transition() + } + } +} + +private fun goBackButton() = + onView(withContentDescription("Navigate up")) + +private fun openAutoPlay() = + onView(allOf(withText("Autoplay"))) + +private fun openCamera() = + onView(allOf(withText("Camera"))) + +private fun openLocation() = + onView(allOf(withText("Location"))) + +private fun openMicrophone() = + onView(allOf(withText("Microphone"))) + +private fun openNotification() = + onView(allOf(withText("Notification"))) + +private fun openPersistentStorage() = + onView(allOf(withText("Persistent Storage"))) + +private fun openDrmControlledContent() = + onView(allOf(withText("DRM-controlled content"))) + +private fun openExceptions() = + onView(allOf(withText("Exceptions"))) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SitePermissionsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SitePermissionsRobot.kt index 54a347fbfbf8..40582b1d3e79 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SitePermissionsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SitePermissionsRobot.kt @@ -119,7 +119,7 @@ class SitePermissionsRobot { fun verifyDRMContentPermissionPrompt(url: String) { try { - assertUIObjectExists(itemWithText("Allow $url to store data in persistent storage?")) + assertUIObjectExists(itemWithText("Allow $url to play DRM-controlled content?")) assertItemTextEquals(denyPagePermissionButton, expectedText = "Don’t allow") assertItemTextEquals(allowPagePermissionButton, expectedText = "Allow") } catch (e: AssertionError) { @@ -127,7 +127,7 @@ class SitePermissionsRobot { }.openThreeDotMenu { }.refreshPage { }.clickRequestDRMControlledContentAccessButton { - assertUIObjectExists(itemWithText("Allow $url to store data in persistent storage?")) + assertUIObjectExists(itemWithText("Allow $url to play DRM-controlled content?")) assertItemTextEquals(denyPagePermissionButton, expectedText = "Don’t allow") assertItemTextEquals(allowPagePermissionButton, expectedText = "Allow") } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 060c4e776f65..87aeaa9f0d64 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,6 +17,16 @@ + + + + + @@ -43,7 +53,6 @@ + + + + + + + + diff --git a/app/src/main/java/org/mozilla/fenix/AppRequestInterceptor.kt b/app/src/main/java/org/mozilla/fenix/AppRequestInterceptor.kt index 036a37aa772a..c1c00d499538 100644 --- a/app/src/main/java/org/mozilla/fenix/AppRequestInterceptor.kt +++ b/app/src/main/java/org/mozilla/fenix/AppRequestInterceptor.kt @@ -27,6 +27,8 @@ class AppRequestInterceptor( this.navController = WeakReference(navController) } + override fun interceptsAppInitiatedRequests() = true + override fun onLoadRequest( engineSession: EngineSession, uri: String, @@ -37,17 +39,27 @@ class AppRequestInterceptor( isDirectNavigation: Boolean, isSubframeRequest: Boolean, ): RequestInterceptor.InterceptionResponse? { - return context.components.services.appLinksInterceptor - .onLoadRequest( - engineSession, - uri, - lastUri, - hasUserGesture, - isSameDomain, - isRedirect, - isDirectNavigation, - isSubframeRequest, - ) + val services = context.components.services + + return services.urlRequestInterceptor.onLoadRequest( + engineSession, + uri, + lastUri, + hasUserGesture, + isSameDomain, + isRedirect, + isDirectNavigation, + isSubframeRequest, + ) ?: services.appLinksInterceptor.onLoadRequest( + engineSession, + uri, + lastUri, + hasUserGesture, + isSameDomain, + isRedirect, + isDirectNavigation, + isSubframeRequest, + ) } override fun onErrorRequest( diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index 180a9561e041..0b7e88b2fc17 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -78,4 +78,14 @@ object FeatureFlags { * Enable Meta attribution. */ const val metaAttributionEnabled = true + + /** + * Enable Toolbar Redesign components and behaviors ready for Nightly. + */ + val completeToolbarRedesignEnabled = Config.channel.isNightlyOrDebug + + /** + * Enable Toolbar Redesign partial components and behaviors. + */ + val incompleteToolbarRedesignEnabled = Config.channel.isDebug } diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 3aadd58031e5..6ba76f2c5209 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -207,6 +207,9 @@ open class FenixApplication : LocaleAwareApplication(), Provider { enableEventTimestamps = FxNimbus.features.glean.value().enableEventTimestamps, ) + // Set the metric configuration from Nimbus. + Glean.setMetricsEnabledConfig(FxNimbus.features.glean.value().metricsEnabled) + Glean.initialize( applicationContext = this, configuration = configuration.setCustomEndpointIfAvailable(customEndpoint), @@ -214,9 +217,6 @@ open class FenixApplication : LocaleAwareApplication(), Provider { buildInfo = GleanBuildInfo.buildInfo, ) - // Set the metric configuration from Nimbus. - Glean.setMetricsEnabledConfig(FxNimbus.features.glean.value().metricsEnabled) - // We avoid blocking the main thread on startup by setting startup metrics on the background thread. val store = components.core.store GlobalScope.launch(Dispatchers.IO) { diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 69d8ffb8d911..f7f6e14f0256 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -46,6 +46,7 @@ import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.Job import kotlinx.coroutines.MainScope import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import mozilla.appservices.places.BookmarkRoot import mozilla.components.browser.state.action.ContentAction @@ -98,7 +99,11 @@ import org.mozilla.fenix.browser.browsingmode.DefaultBrowsingModeManager import org.mozilla.fenix.components.appstate.AppAction import org.mozilla.fenix.components.metrics.BreadcrumbsRecorder import org.mozilla.fenix.components.metrics.GrowthDataWorker +import org.mozilla.fenix.components.metrics.fonts.FontEnumerationWorker +import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity import org.mozilla.fenix.databinding.ActivityHomeBinding +import org.mozilla.fenix.debugsettings.data.DefaultDebugSettingsRepository +import org.mozilla.fenix.debugsettings.ui.DebugOverlay import org.mozilla.fenix.exceptions.trackingprotection.TrackingProtectionExceptionsFragmentDirections import org.mozilla.fenix.experiments.ResearchSurfaceDialogFragment import org.mozilla.fenix.ext.alreadyOnDestination @@ -157,6 +162,8 @@ import org.mozilla.fenix.tabhistory.TabHistoryDialogFragment import org.mozilla.fenix.tabstray.TabsTrayFragment import org.mozilla.fenix.tabstray.TabsTrayFragmentDirections import org.mozilla.fenix.theme.DefaultThemeManager +import org.mozilla.fenix.theme.FirefoxTheme +import org.mozilla.fenix.theme.Theme import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.trackingprotection.TrackingProtectionPanelDialogFragmentDirections import org.mozilla.fenix.utils.Settings @@ -277,6 +284,36 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { window.decorView.layoutDirection = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) binding = ActivityHomeBinding.inflate(layoutInflater) + + if (Config.channel.isNightlyOrDebug) { + lifecycleScope.launch { + val debugSettingsRepository = DefaultDebugSettingsRepository( + context = this@HomeActivity, + writeScope = this, + ) + + debugSettingsRepository.debugDrawerEnabled + .distinctUntilChanged() + .collect { enabled -> + with(binding.debugOverlay) { + if (enabled) { + visibility = View.VISIBLE + + setContent { + FirefoxTheme(theme = Theme.getTheme(allowPrivateTheme = false)) { + DebugOverlay() + } + } + } else { + setContent {} + + visibility = View.GONE + } + } + } + } + } + setContentView(binding.root) ProfilerMarkers.addListenerForOnGlobalLayout(components.core.engine, this, binding.root) @@ -294,14 +331,14 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { it.start() } - if (settings().shouldShowJunoOnboarding( + if (settings().shouldShowOnboarding( hasUserBeenOnboarded = components.fenixOnboarding.userHasBeenOnboarded(), isLauncherIntent = intent.toSafeIntent().isLauncherIntent, ) ) { // Unless activity is recreated due to config change, navigate to onboarding if (savedInstanceState == null) { - navHost.navController.navigate(NavGraphDirections.actionGlobalJunoOnboarding()) + navHost.navController.navigate(NavGraphDirections.actionGlobalOnboarding()) } } else { lifecycleScope.launch(IO) { @@ -521,6 +558,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { } GrowthDataWorker.sendActivatedSignalIfNeeded(applicationContext) + FontEnumerationWorker.sendActivatedSignalIfNeeded(applicationContext) ReEngagementNotificationWorker.setReEngagementNotificationIfNeeded(applicationContext) MessageNotificationWorker.setMessageNotificationWorker(applicationContext) } @@ -570,17 +608,15 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { components.core.store.state.getNormalOrPrivateTabs(private = false).isNotEmpty() lifecycleScope.launch(IO) { - components.core.bookmarksStorage.getTree(BookmarkRoot.Root.id, true)?.let { - val desktopRootNode = DesktopFolders( - applicationContext, - showMobileRoot = false, - ).withOptionalDesktopFolders(it) - settings().desktopBookmarksSize = desktopRootNode.count() - } + val desktopFolders = DesktopFolders( + applicationContext, + showMobileRoot = false, + ) + settings().desktopBookmarksSize = desktopFolders.count() - components.core.bookmarksStorage.getTree(BookmarkRoot.Mobile.id, true)?.let { - settings().mobileBookmarksSize = it.count() - } + settings().mobileBookmarksSize = components.core.bookmarksStorage.countBookmarksInTrees( + listOf(BookmarkRoot.Mobile.id), + ).toInt() } super.onPause() @@ -626,7 +662,10 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { components.core.pocketStoriesService.stopPeriodicSponsoredStoriesRefresh() privateNotificationObserver?.stop() components.notificationsDelegate.unBindActivity(this) - stopMediaSession() + + if (this !is ExternalAppBrowserActivity) { + stopMediaSession() + } } override fun onConfigurationChanged(newConfig: Configuration) { diff --git a/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt b/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt index 4fa209ec2496..056f7def3681 100644 --- a/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt @@ -15,6 +15,7 @@ import mozilla.components.feature.intent.ext.sanitize import mozilla.components.feature.intent.processing.IntentProcessor import mozilla.components.support.utils.EXTRA_ACTIVITY_REFERRER_CATEGORY import mozilla.components.support.utils.EXTRA_ACTIVITY_REFERRER_PACKAGE +import mozilla.components.support.utils.INTENT_TYPE_PDF import mozilla.components.support.utils.ext.getApplicationInfoCompat import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.HomeActivity.Companion.PRIVATE_BROWSING_MODE @@ -73,6 +74,12 @@ class IntentReceiverActivity : Activity() { addReferrerInformation(intent) + if (intent.type == INTENT_TYPE_PDF) { + val referrerIsFenix = + intent.getStringExtra(EXTRA_ACTIVITY_REFERRER_PACKAGE) == this.packageName + Events.openedExtPdf.record(Events.OpenedExtPdfExtra(referrerIsFenix)) + } + val processor = getIntentProcessors(private).firstOrNull { it.process(intent) } val intentProcessorType = components.intentProcessors.getType(processor) diff --git a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt index 6cb35738f76f..ea75d1292eef 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt @@ -34,6 +34,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch +import mozilla.components.concept.engine.webextension.InstallationMethod import mozilla.components.feature.addons.Addon import mozilla.components.feature.addons.AddonManager import mozilla.components.feature.addons.AddonManagerException @@ -335,14 +336,15 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management) binding?.let { announceForAccessibility(it.addonProgressOverlay.addOnsOverlayText.text) } } val installOperation = provideAddonManger().installAddon( - addon, + url = addon.downloadUrl, + installationMethod = InstallationMethod.MANAGER, onSuccess = { runIfFragmentIsAttached { adapter?.updateAddon(it) binding?.addonProgressOverlay?.overlayCardView?.visibility = View.GONE } }, - onError = { _, _ -> + onError = { _ -> binding?.addonProgressOverlay?.overlayCardView?.visibility = View.GONE }, ) diff --git a/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt index 1e4f08435033..3da061c25af5 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt @@ -23,6 +23,7 @@ import mozilla.components.feature.addons.Addon import mozilla.components.feature.addons.AddonManager import mozilla.components.feature.addons.AddonManagerException import mozilla.components.feature.addons.ui.translateName +import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.databinding.FragmentInstalledAddOnDetailsBinding @@ -37,8 +38,11 @@ import org.mozilla.fenix.ext.showToolbar class InstalledAddonDetailsFragment : Fragment() { @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal lateinit var addon: Addon + + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal val binding get() = _binding!! + private var _binding: FragmentInstalledAddOnDetailsBinding? = null - private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, @@ -49,14 +53,14 @@ class InstalledAddonDetailsFragment : Fragment() { addon = AddonDetailsFragmentArgs.fromBundle(requireNotNull(arguments)).addon } - _binding = FragmentInstalledAddOnDetailsBinding.inflate( - inflater, - container, - false, + setBindingAndBindUI( + FragmentInstalledAddOnDetailsBinding.inflate( + inflater, + container, + false, + ), ) - bindUI() - return binding.root } @@ -77,6 +81,12 @@ class InstalledAddonDetailsFragment : Fragment() { _binding = null } + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal fun setBindingAndBindUI(binding: FragmentInstalledAddOnDetailsBinding) { + _binding = binding + bindUI() + } + private fun bindAddon() { lifecycleScope.launch(Dispatchers.IO) { try { @@ -116,6 +126,7 @@ class InstalledAddonDetailsFragment : Fragment() { bindPermissions() bindAllowInPrivateBrowsingSwitch() bindRemoveButton() + bindReportButton() } @VisibleForTesting @@ -143,7 +154,7 @@ class InstalledAddonDetailsFragment : Fragment() { switch.setOnCheckedChangeListener { v, isChecked -> val addonManager = v.context.components.addonManager switch.isClickable = false - binding.removeAddOn.isEnabled = false + disableButtons() if (isChecked) { enableAddon( addonManager, @@ -155,7 +166,7 @@ class InstalledAddonDetailsFragment : Fragment() { privateBrowsingSwitch.isChecked = it.isAllowedInPrivateBrowsing() switch.setText(R.string.mozac_feature_addons_enabled) binding.settings.isVisible = shouldSettingsBeVisible() - binding.removeAddOn.isEnabled = true + enableButtons() context?.let { showSnackBar( binding.root, @@ -170,7 +181,7 @@ class InstalledAddonDetailsFragment : Fragment() { onError = { runIfFragmentIsAttached { switch.isClickable = true - binding.removeAddOn.isEnabled = true + enableButtons() switch.setState(addon.isEnabled()) context?.let { showSnackBar( @@ -194,7 +205,7 @@ class InstalledAddonDetailsFragment : Fragment() { switch.isClickable = true privateBrowsingSwitch.isVisible = it.isEnabled() switch.setText(R.string.mozac_feature_addons_disabled) - binding.removeAddOn.isEnabled = true + enableButtons() context?.let { showSnackBar( binding.root, @@ -210,7 +221,7 @@ class InstalledAddonDetailsFragment : Fragment() { runIfFragmentIsAttached { switch.isClickable = true privateBrowsingSwitch.isClickable = true - binding.removeAddOn.isEnabled = true + enableButtons() switch.setState(addon.isEnabled()) context?.let { showSnackBar( @@ -250,6 +261,23 @@ class InstalledAddonDetailsFragment : Fragment() { } } + private fun bindReportButton() { + binding.reportAddOn.setOnClickListener { + val shouldCreatePrivateSession = (activity as HomeActivity).browsingModeManager.mode.isPrivate + + it.context.components.useCases.tabsUseCases.selectOrAddTab( + url = "${BuildConfig.AMO_BASE_URL}/android/feedback/addon/${addon.id}/", + private = shouldCreatePrivateSession, + ignoreFragment = true, + ) + + // Send user to the newly open tab. + Navigation.findNavController(it).navigate( + InstalledAddonDetailsFragmentDirections.actionGlobalBrowser(null), + ) + } + } + private fun bindSettings() { binding.settings.apply { isVisible = shouldSettingsBeVisible() @@ -304,7 +332,7 @@ class InstalledAddonDetailsFragment : Fragment() { switch.setOnCheckedChangeListener { v, isChecked -> val addonManager = v.context.components.addonManager switch.isClickable = false - binding.removeAddOn.isEnabled = false + disableButtons() addonManager.setAddonAllowedInPrivateBrowsing( addon, isChecked, @@ -312,14 +340,14 @@ class InstalledAddonDetailsFragment : Fragment() { runIfFragmentIsAttached { this.addon = it switch.isClickable = true - binding.removeAddOn.isEnabled = true + enableButtons() } }, onError = { runIfFragmentIsAttached { switch.isChecked = addon.isAllowedInPrivateBrowsing() switch.isClickable = true - binding.removeAddOn.isEnabled = true + enableButtons() } }, ) @@ -373,6 +401,17 @@ class InstalledAddonDetailsFragment : Fragment() { binding.details.isClickable = clickable binding.permissions.isClickable = clickable binding.removeAddOn.isClickable = clickable + binding.reportAddOn.isClickable = clickable + } + + private fun enableButtons() { + binding.removeAddOn.isEnabled = true + binding.reportAddOn.isEnabled = true + } + + private fun disableButtons() { + binding.removeAddOn.isEnabled = false + binding.reportAddOn.isEnabled = false } private fun SwitchMaterial.setState(checked: Boolean) { diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index f810667c455d..b44da3d459bc 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -150,6 +150,7 @@ import org.mozilla.fenix.ext.secure import org.mozilla.fenix.ext.settings import org.mozilla.fenix.home.HomeScreenViewModel import org.mozilla.fenix.home.SharedViewModel +import org.mozilla.fenix.library.bookmarks.BookmarksSharedViewModel import org.mozilla.fenix.perf.MarkersFragmentLifecycleCallbacks import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.settings.biometric.BiometricPromptFeature @@ -230,6 +231,7 @@ abstract class BaseBrowserFragment : internal val sharedViewModel: SharedViewModel by activityViewModels() private val homeViewModel: HomeScreenViewModel by activityViewModels() + private val bookmarksSharedViewModel: BookmarksSharedViewModel by activityViewModels() private var currentStartDownloadDialog: StartDownloadDialog? = null @@ -1414,7 +1416,7 @@ abstract class BaseBrowserFragment : // Save bookmark, then go to edit fragment try { val guid = bookmarksStorage.addItem( - BookmarkRoot.Mobile.id, + bookmarksSharedViewModel.selectedFolder?.guid ?: BookmarkRoot.Mobile.id, url = sessionUrl, title = sessionTitle, position = null, diff --git a/app/src/main/java/org/mozilla/fenix/browser/ToolbarGestureHandler.kt b/app/src/main/java/org/mozilla/fenix/browser/ToolbarGestureHandler.kt index 98fd2148326a..f809d9f2c349 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/ToolbarGestureHandler.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/ToolbarGestureHandler.kt @@ -25,6 +25,8 @@ import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.support.ktx.android.view.getRectWithViewLocation import mozilla.components.support.utils.ext.bottom import mozilla.components.support.utils.ext.mandatorySystemGestureInsets +import mozilla.telemetry.glean.private.NoExtras +import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.R import org.mozilla.fenix.ext.getRectWithScreenLocation import org.mozilla.fenix.ext.getWindowInsets @@ -260,6 +262,7 @@ class ToolbarGestureHandler( object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { tabPreview.isVisible = false + Events.toolbarTabSwipe.record(NoExtras()) } }, ) diff --git a/app/src/main/java/org/mozilla/fenix/components/Components.kt b/app/src/main/java/org/mozilla/fenix/components/Components.kt index b9d3a50d04af..2f455ec4cc22 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Components.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -207,7 +207,7 @@ class Components(private val context: Context) { ) } - val fxSuggest by lazyMonitored { FxSuggest(context) } + val fxSuggest by lazyMonitored { FxSuggest(context, analytics.crashReporter) } } /** diff --git a/app/src/main/java/org/mozilla/fenix/components/Core.kt b/app/src/main/java/org/mozilla/fenix/components/Core.kt index b9a73a5df072..e1978453a685 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -142,11 +142,13 @@ class Core( R.color.fx_mobile_layer_color_1, ), httpsOnlyMode = context.settings().getHttpsOnlyMode(), + globalPrivacyControlEnabled = context.settings().shouldEnableGlobalPrivacyControl, cookieBannerHandlingMode = context.settings().getCookieBannerHandling(), cookieBannerHandlingModePrivateBrowsing = context.settings().getCookieBannerHandlingPrivateMode(), cookieBannerHandlingDetectOnlyMode = context.settings().shouldEnableCookieBannerDetectOnly, cookieBannerHandlingGlobalRules = context.settings().shouldEnableCookieBannerGlobalRules, cookieBannerHandlingGlobalRulesSubFrames = context.settings().shouldEnableCookieBannerGlobalRulesSubFrame, + emailTrackerBlockingPrivateBrowsing = true, ) GeckoEngine( diff --git a/app/src/main/java/org/mozilla/fenix/components/FxSuggest.kt b/app/src/main/java/org/mozilla/fenix/components/FxSuggest.kt index 05593c97fc32..22a4444420bc 100644 --- a/app/src/main/java/org/mozilla/fenix/components/FxSuggest.kt +++ b/app/src/main/java/org/mozilla/fenix/components/FxSuggest.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.components import android.content.Context +import mozilla.components.concept.base.crash.CrashReporting import mozilla.components.feature.fxsuggest.FxSuggestIngestionScheduler import mozilla.components.feature.fxsuggest.FxSuggestStorage import org.mozilla.fenix.perf.lazyMonitored @@ -13,10 +14,12 @@ import org.mozilla.fenix.perf.lazyMonitored * Component group for Firefox Suggest. * * @param context The Android application context. + * @param crashReporter An optional [CrashReporting] instance for reporting unexpected caught + * exceptions. */ -class FxSuggest(context: Context) { +class FxSuggest(context: Context, crashReporter: CrashReporting? = null) { val storage by lazyMonitored { - FxSuggestStorage(context) + FxSuggestStorage(context, crashReporter) } val ingestionScheduler by lazyMonitored { diff --git a/app/src/main/java/org/mozilla/fenix/components/Services.kt b/app/src/main/java/org/mozilla/fenix/components/Services.kt index 1623b24a8e14..918dfab86e75 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Services.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Services.kt @@ -11,6 +11,7 @@ import kotlinx.coroutines.launch import mozilla.components.feature.accounts.FirefoxAccountsAuthFeature import mozilla.components.feature.app.links.AppLinksInterceptor import mozilla.components.service.fxa.manager.FxaAccountManager +import org.mozilla.fenix.ext.application import org.mozilla.fenix.ext.settings import org.mozilla.fenix.perf.lazyMonitored import org.mozilla.fenix.settings.SupportUtils @@ -38,4 +39,10 @@ class Services( launchInApp = { context.settings().shouldOpenLinksInApp() }, ) } + + val urlRequestInterceptor by lazyMonitored { + UrlRequestInterceptor( + isDeviceRamAboveThreshold = context.application.isDeviceRamAboveThreshold, + ) + } } diff --git a/app/src/main/java/org/mozilla/fenix/components/UrlRequestInterceptor.kt b/app/src/main/java/org/mozilla/fenix/components/UrlRequestInterceptor.kt new file mode 100644 index 000000000000..d267a60436a2 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/components/UrlRequestInterceptor.kt @@ -0,0 +1,70 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components + +import androidx.annotation.VisibleForTesting +import mozilla.components.concept.engine.EngineSession +import mozilla.components.concept.engine.EngineSession.LoadUrlFlags +import mozilla.components.concept.engine.EngineSession.LoadUrlFlags.Companion.ALLOW_ADDITIONAL_HEADERS +import mozilla.components.concept.engine.EngineSession.LoadUrlFlags.Companion.LOAD_FLAGS_BYPASS_LOAD_URI_DELEGATE +import mozilla.components.concept.engine.request.RequestInterceptor + +/** + * [RequestInterceptor] implementation for intercepting URL load requests to allow custom + * behaviour. + * + * @param isDeviceRamAboveThreshold Whether or not the device ram is above a threshold. + */ +class UrlRequestInterceptor(private val isDeviceRamAboveThreshold: Boolean) : RequestInterceptor { + + private val isGoogleSearchRequest by lazy { + Regex("^https://www\\.google\\.(?:.+)/search") + } + + @VisibleForTesting + internal fun getAdditionalHeaders(isDeviceRamAboveThreshold: Boolean): Map { + val value = if (isDeviceRamAboveThreshold) { + "1" + } else { + "0" + } + + return mapOf( + "X-Search-Subdivision" to value, + ) + } + + @VisibleForTesting + internal fun shouldInterceptRequest( + uri: String, + isSubframeRequest: Boolean, + ): Boolean { + return !isSubframeRequest && isGoogleSearchRequest.containsMatchIn(uri) + } + + override fun onLoadRequest( + engineSession: EngineSession, + uri: String, + lastUri: String?, + hasUserGesture: Boolean, + isSameDomain: Boolean, + isRedirect: Boolean, + isDirectNavigation: Boolean, + isSubframeRequest: Boolean, + ): RequestInterceptor.InterceptionResponse? { + if (!shouldInterceptRequest(uri = uri, isSubframeRequest = isSubframeRequest)) { + return null + } + + return RequestInterceptor.InterceptionResponse.Url( + url = uri, + flags = LoadUrlFlags.select( + LOAD_FLAGS_BYPASS_LOAD_URI_DELEGATE, + ALLOW_ADDITIONAL_HEADERS, + ), + additionalHeaders = getAdditionalHeaders(isDeviceRamAboveThreshold), + ) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt b/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt index 6a2bb18e0b0d..eae237c468aa 100644 --- a/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt +++ b/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt @@ -15,6 +15,7 @@ import mozilla.components.service.pocket.PocketStory.PocketSponsoredStory import org.mozilla.fenix.browser.StandardSnackbarError import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.AppStore +import org.mozilla.fenix.components.appstate.shopping.ShoppingState import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesSelectedCategory import org.mozilla.fenix.home.recentbookmarks.RecentBookmark @@ -250,5 +251,12 @@ sealed class AppAction : Action { val productPageUrl: String, val expanded: Boolean, ) : ShoppingAction() + + /** + * [ShoppingAction] used to update the recorded product recommendation impressions set. + */ + data class ProductRecommendationImpression( + val key: ShoppingState.ProductRecommendationImpressionKey, + ) : ShoppingAction() } } diff --git a/app/src/main/java/org/mozilla/fenix/components/appstate/shopping/ShoppingState.kt b/app/src/main/java/org/mozilla/fenix/components/appstate/shopping/ShoppingState.kt index d2287bd55ea4..a9dd7f2c8207 100644 --- a/app/src/main/java/org/mozilla/fenix/components/appstate/shopping/ShoppingState.kt +++ b/app/src/main/java/org/mozilla/fenix/components/appstate/shopping/ShoppingState.kt @@ -10,12 +10,28 @@ package org.mozilla.fenix.components.appstate.shopping * @property shoppingSheetExpanded Boolean indicating if the shopping sheet is expanded and visible. * @property productCardState Map of product url to [CardState] that contains the state of different * cards in the shopping sheet. + * @property recordedProductRecommendationImpressions Set of [ProductRecommendationImpressionKey] + * that contains the product recommendation impressions that have been recorded. */ data class ShoppingState( val shoppingSheetExpanded: Boolean? = null, val productCardState: Map = emptyMap(), + val recordedProductRecommendationImpressions: Set = emptySet(), ) { + /** + * Key for a product recommendation impression. + * + * @property tabId The id of the tab that the product and recommendation is displayed in. + * @property productUrl The url of the product. + * @property aid The id of the recommendation. + */ + data class ProductRecommendationImpressionKey( + val tabId: String, + val productUrl: String, + val aid: String, + ) + /** * State for different cards in the shopping sheet for a product. * diff --git a/app/src/main/java/org/mozilla/fenix/components/appstate/shopping/ShoppingStateReducer.kt b/app/src/main/java/org/mozilla/fenix/components/appstate/shopping/ShoppingStateReducer.kt index f8c5b2b59d18..4779d26ac8e2 100644 --- a/app/src/main/java/org/mozilla/fenix/components/appstate/shopping/ShoppingStateReducer.kt +++ b/app/src/main/java/org/mozilla/fenix/components/appstate/shopping/ShoppingStateReducer.kt @@ -64,6 +64,13 @@ internal object ShoppingStateReducer { ), ) } + + is ShoppingAction.ProductRecommendationImpression -> state.copy( + shoppingState = state.shoppingState.copy( + recordedProductRecommendationImpressions = + state.shoppingState.recordedProductRecommendationImpressions + action.key, + ), + ) } private fun ShoppingState.updateProductCardState(key: String, value: CardState): ShoppingState = diff --git a/app/src/main/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCase.kt b/app/src/main/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCase.kt index 19a8c856b6ac..f8ea604c3490 100644 --- a/app/src/main/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCase.kt +++ b/app/src/main/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCase.kt @@ -29,13 +29,18 @@ class BookmarksUseCase( * one with the identical [url] already exists. */ @WorkerThread - suspend operator fun invoke(url: String, title: String, position: UInt? = null): Boolean { + suspend operator fun invoke( + url: String, + title: String, + position: UInt? = null, + parentGuid: String? = null, + ): Boolean { return try { val canAdd = storage.getBookmarksWithUrl(url).firstOrNull { it.url == url } == null if (canAdd) { storage.addItem( - BookmarkRoot.Mobile.id, + parentGuid ?: BookmarkRoot.Mobile.id, url = url, title = title, position = position, diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt index 37bbc92813fe..453ff4750a44 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt @@ -283,12 +283,33 @@ internal class ReleaseMetricController( Component.FEATURE_FXSUGGEST to FxSuggestFacts.Items.AMP_SUGGESTION_CLICKED, Component.FEATURE_FXSUGGEST to FxSuggestFacts.Items.WIKIPEDIA_SUGGESTION_CLICKED, -> { + val clickInfo = metadata?.get(FxSuggestFacts.MetadataKeys.INTERACTION_INFO) + + // Record an event for this click in the `events` ping. These events include the `client_id`. + when (clickInfo) { + is FxSuggestInteractionInfo.Amp -> { + Awesomebar.sponsoredSuggestionClicked.record( + Awesomebar.SponsoredSuggestionClickedExtra( + provider = "amp", + ), + ) + } + is FxSuggestInteractionInfo.Wikipedia -> { + Awesomebar.nonSponsoredSuggestionClicked.record( + Awesomebar.NonSponsoredSuggestionClickedExtra( + provider = "wikipedia", + ), + ) + } + } + + // Submit a separate `fx-suggest` ping for this click. These pings do not include the `client_id`. FxSuggest.pingType.set("fxsuggest-click") FxSuggest.isClicked.set(true) (metadata?.get(FxSuggestFacts.MetadataKeys.POSITION) as? Long)?.let { FxSuggest.position.set(it) } - when (val clickInfo = metadata?.get(FxSuggestFacts.MetadataKeys.INTERACTION_INFO)) { + when (clickInfo) { is FxSuggestInteractionInfo.Amp -> { FxSuggest.blockId.set(clickInfo.blockId) FxSuggest.advertiser.set(clickInfo.advertiser) @@ -307,27 +328,58 @@ internal class ReleaseMetricController( Component.FEATURE_FXSUGGEST to FxSuggestFacts.Items.AMP_SUGGESTION_IMPRESSED, Component.FEATURE_FXSUGGEST to FxSuggestFacts.Items.WIKIPEDIA_SUGGESTION_IMPRESSED, -> { - FxSuggest.pingType.set("fxsuggest-impression") - (metadata?.get(FxSuggestFacts.MetadataKeys.IS_CLICKED) as? Boolean)?.let { - FxSuggest.isClicked.set(it) - } - (metadata?.get(FxSuggestFacts.MetadataKeys.POSITION) as? Long)?.let { - FxSuggest.position.set(it) - } - when (val impressionInfo = metadata?.get(FxSuggestFacts.MetadataKeys.INTERACTION_INFO)) { + val impressionInfo = metadata?.get(FxSuggestFacts.MetadataKeys.INTERACTION_INFO) + val engagementAbandoned = metadata?.get(FxSuggestFacts.MetadataKeys.ENGAGEMENT_ABANDONED) as? Boolean + ?: false + + // Record an event for this impression in the `events` ping. These events include the `client_id`, and + // we record them for engaged and abandoned search sessions. + when (impressionInfo) { is FxSuggestInteractionInfo.Amp -> { - FxSuggest.blockId.set(impressionInfo.blockId) - FxSuggest.advertiser.set(impressionInfo.advertiser) - FxSuggest.reportingUrl.set(impressionInfo.reportingUrl) - FxSuggest.iabCategory.set(impressionInfo.iabCategory) - FxSuggest.contextId.set(UUID.fromString(impressionInfo.contextId)) + Awesomebar.sponsoredSuggestionImpressed.record( + Awesomebar.SponsoredSuggestionImpressedExtra( + provider = "amp", + engagementAbandoned = engagementAbandoned, + ), + ) } is FxSuggestInteractionInfo.Wikipedia -> { - FxSuggest.advertiser.set("wikipedia") - FxSuggest.contextId.set(UUID.fromString(impressionInfo.contextId)) + Awesomebar.nonSponsoredSuggestionImpressed.record( + Awesomebar.NonSponsoredSuggestionImpressedExtra( + provider = "wikipedia", + engagementAbandoned = engagementAbandoned, + ), + ) } } - Pings.fxSuggest.submit() + + // Submit a separate `fx-suggest` ping for this impression. These pings do not include the `client_id`, + // and we submit them for engaged search sessions only. + if (!engagementAbandoned) { + FxSuggest.pingType.set("fxsuggest-impression") + (metadata?.get(FxSuggestFacts.MetadataKeys.IS_CLICKED) as? Boolean)?.let { + FxSuggest.isClicked.set(it) + } + (metadata?.get(FxSuggestFacts.MetadataKeys.POSITION) as? Long)?.let { + FxSuggest.position.set(it) + } + when (impressionInfo) { + is FxSuggestInteractionInfo.Amp -> { + FxSuggest.blockId.set(impressionInfo.blockId) + FxSuggest.advertiser.set(impressionInfo.advertiser) + FxSuggest.reportingUrl.set(impressionInfo.reportingUrl) + FxSuggest.iabCategory.set(impressionInfo.iabCategory) + FxSuggest.contextId.set(UUID.fromString(impressionInfo.contextId)) + } + is FxSuggestInteractionInfo.Wikipedia -> { + FxSuggest.advertiser.set("wikipedia") + FxSuggest.contextId.set(UUID.fromString(impressionInfo.contextId)) + } + } + Pings.fxSuggest.submit() + } + + Unit } Component.FEATURE_PWA to ProgressiveWebAppFacts.Items.HOMESCREEN_ICON_TAP -> { diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/fonts/FontEnumerationWorker.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/fonts/FontEnumerationWorker.kt new file mode 100644 index 000000000000..7722af20e2bd --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/fonts/FontEnumerationWorker.kt @@ -0,0 +1,212 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.metrics.fonts + +import android.content.Context +import android.content.res.Configuration +import android.graphics.fonts.Font +import android.graphics.fonts.SystemFonts +import android.os.Build +import android.os.LocaleList +import androidx.work.BackoffPolicy +import androidx.work.CoroutineWorker +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequest +import androidx.work.WorkManager +import androidx.work.WorkerParameters +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.json.JSONArray +import org.json.JSONException +import org.json.JSONObject +import org.mozilla.fenix.Config +import org.mozilla.fenix.GleanMetrics.Metrics +import org.mozilla.fenix.GleanMetrics.Pings +import org.mozilla.fenix.ext.settings +import java.io.File +import java.util.Locale +import java.util.concurrent.TimeUnit +import kotlin.time.Duration.Companion.hours + +/** + * Parse all of the fonts on the user's phone, then put them into the + * `font_list_json` Metric to be submitted via Telemetry later. + */ +class FontEnumerationWorker( + context: Context, + workerParameters: WorkerParameters, +) : CoroutineWorker(context, workerParameters) { + @Suppress("TooGenericExceptionCaught") + override suspend fun doWork(): Result = withContext(Dispatchers.IO) { + val s: String + try { + readAllFonts() + s = createJSONString() + } catch (e: Exception) { + return@withContext Result.retry() + } + + Metrics.fontListJson.set(s) + Pings.fontList.submit() + + // To avoid getting multiple submissions from new installs, set directly + // to the desired number of submissions + applicationContext.settings().numFontListSent = kDesiredSubmissions + + return@withContext Result.success() + } + + private val brokenFonts: ArrayList> = ArrayList() + private val fonts: MutableSet = HashSet() + + @Suppress("TooGenericExceptionCaught") + private fun readAllFonts() { + for (path in getSystemFonts()) { + try { + fonts.add(FontParser.parse(path)) + } catch (e: Exception) { + brokenFonts.add(Pair(path, FontParser.calculateFileHash(path))) + } + } + for (path in getAPIFonts()) { + try { + fonts.add(FontParser.parse(path)) + } catch (e: Exception) { + brokenFonts.add(Pair(path, FontParser.calculateFileHash(path))) + } + } + } + + /** + * This function creates a single JSON String containing + * The user's phone information, as well as all the fonts and their information, + * And the names of files that encountered a parsing error. + */ + @Throws(JSONException::class) + fun createJSONString(): String { + val submission = JSONObject() + + run { + submission.put("submission", kDesiredSubmissions) + submission.put("brand", Build.BRAND) + submission.put("device", Build.DEVICE) + submission.put("hardware", Build.HARDWARE) + submission.put("manufacturer", Build.MANUFACTURER) + submission.put("model", Build.MODEL) + submission.put("product", Build.PRODUCT) + submission.put("release_version", Build.VERSION.RELEASE) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + submission.put("security_patch", Build.VERSION.SECURITY_PATCH) + submission.put("base_os", Build.VERSION.BASE_OS) + } else { + submission.put("security_patch", "too-low-version") + submission.put("base_os", "too-low-version") + } + val config: Configuration = this.applicationContext.resources.configuration + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + val supportedLocales: LocaleList = LocaleList.getDefault() + val sb = StringBuilder() + for (i in 0 until supportedLocales.size()) { + val locale: Locale = supportedLocales.get(i) + sb.append(locale.toString()) + sb.append(",") + } + submission.put("current_locale", config.locales[0].toString()) + submission.put("all_locales", sb.toString()) + } else { + @Suppress("DEPRECATION") + submission.put("current_locale", config.locale.toString()) + submission.put("all_locales", "too-low-version") + } + } + + val fontArr = JSONArray() + for (fontDetails in fonts) { + fontArr.put(fontDetails.toJson()) + } + + val errorArr = JSONArray() + for (error in brokenFonts) { + val errorObj = JSONObject() + errorObj.put("path", error.first) + errorObj.put("hash", error.second) + errorArr.put(errorObj) + } + + submission.put("fonts", fontArr) + submission.put("errors", errorArr) + + return submission.toString() + } + + companion object { + private const val FONT_ENUMERATOR_WORK_NAME = "org.mozilla.fenix.metrics.font.work" + private val HOUR_MILLIS: Long = 1.hours.inWholeMilliseconds + private const val SIX: Long = 6 + + /** + * Schedules the Activated User event if needed. + */ + fun sendActivatedSignalIfNeeded(context: Context) { + val instanceWorkManager = WorkManager.getInstance(context) + + if (!Config.channel.isNightlyOrDebug) { + return + } + + if (context.settings().numFontListSent >= kDesiredSubmissions) { + return + } + + val fontEnumeratorWork = + OneTimeWorkRequest.Builder(FontEnumerationWorker::class.java) + .setInitialDelay(HOUR_MILLIS, TimeUnit.MILLISECONDS) + .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, SIX, TimeUnit.HOURS) + .build() + + instanceWorkManager.beginUniqueWork( + FONT_ENUMERATOR_WORK_NAME, + ExistingWorkPolicy.KEEP, + fontEnumeratorWork, + ).enqueue() + } + + private fun getSystemFonts(): ArrayList { + val file = File("/system/fonts") + val ff: Array? = file.listFiles() + val systemFonts: ArrayList = ArrayList() + if (ff != null) { + for (f in ff) { + systemFonts.add(f.absolutePath) + } + } + return systemFonts + } + + private fun getAPIFonts(): List { + val aPIFonts: List + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + aPIFonts = emptyList() + } else { + aPIFonts = ArrayList() + val apiFonts: Set = SystemFonts.getAvailableFonts() + for (f in apiFonts) { + f.file?.let { + aPIFonts.add(it.absolutePath) + } + } + } + return aPIFonts + } + + /** + * The number of font submissions we would like from a user. + * We will increment this number by one (via a code patch) when + * we wish to perform another data collection effort on the Nightly + * population. + */ + const val kDesiredSubmissions: Int = 4 + } +} diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/fonts/FontParser.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/fonts/FontParser.kt new file mode 100644 index 000000000000..eaf743fe1bf4 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/fonts/FontParser.kt @@ -0,0 +1,253 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.metrics.fonts + +import org.json.JSONException +import org.json.JSONObject +import java.io.DataInputStream +import java.io.FileInputStream +import java.io.IOException +import java.io.InputStream +import java.security.MessageDigest +import java.security.NoSuchAlgorithmException +import kotlin.math.min + +/** + * FontMetric represents the information about a Font File + */ +data class FontMetric( + val path: String = "", + val hash: String = "", +) { + var family: String = "" + var subFamily: String = "" + var uniqueSubFamily: String = "" + var fullName: String = "" + var fontVersion: String = "" + var revision: Int = -1 + var created: Long = -1L + var modified: Long = -1L + + /** + * Return a JSONObject of this Font's details + */ + fun toJson(): JSONObject { + val jsonObject = JSONObject() + try { + // Use abbreviations to make the json smaller + jsonObject.put("F", family.replace("\u0000", "")) + jsonObject.put("SF", subFamily.replace("\u0000", "")) + jsonObject.put("USF", uniqueSubFamily.replace("\u0000", "")) + jsonObject.put("FN", fullName.replace("\u0000", "")) + jsonObject.put("V", fontVersion.replace("\u0000", "")) + jsonObject.put("R", revision) + jsonObject.put("C", created) + jsonObject.put("M", modified) + jsonObject.put("H", hash) + jsonObject.put("P", path.replace("\u0000", "")) + } catch (_: JSONException) { + } + return jsonObject + } +} + +/** + * Parse a font, given via an InputStream, to extract the Font information + * including Family, SubFamily, Revision, etc + */ +object FontParser { + /** + * Parse a font file and return a FontMetric object describing it. + * These functions are very similar, because this one is used in + * real devices, the other in unit tests. Outside tests, the + * FileInputStream does not support the reset() method + */ + fun parse(path: String): FontMetric { + val hash = calculateFileHash(FileInputStream(path)) + val fontDetails = FontMetric(path, hash) + + readFontFile(FileInputStream(path), fontDetails) + + return fontDetails + } + + /** + * Parse a font file and return a FontMetric object describing it + */ + fun parse(path: String, inputStream: InputStream): FontMetric { + val hash = calculateFileHash(inputStream) + val fontDetails = FontMetric(path, hash) + + inputStream.reset() + readFontFile(inputStream, fontDetails) + + return fontDetails + } + + @Suppress("MagicNumber") + private fun readFontFile(inputStream: InputStream, fontDetails: FontMetric) { + val file = DataInputStream(inputStream) + val numFonts: Int + val magicNumber = file.readInt() + var bytesReadSoFar = 4 + + if (magicNumber == 0x74746366) { + // The Font File has a TTC Header + val majorVersion = file.readUnsignedShort() + file.skipBytes(2) // Minor Version + numFonts = file.readInt() + bytesReadSoFar += 8 + + file.skipBytes(4 * numFonts) // OffsetTable + bytesReadSoFar += 4 * numFonts + if (majorVersion == 2) { + file.skipBytes(12) + bytesReadSoFar += 12 + } + + file.skipBytes(4) // Magic Number for the Font + bytesReadSoFar += 4 + } + val numTables: Int = file.readUnsignedShort() + bytesReadSoFar += 2 + file.skipBytes(6) // Rest of header + bytesReadSoFar += 6 + + // Find the head table + var headOffset = 0 + var nameOffset = 0 + var nameLength = 0 + for (i in 0 until numTables) { + val tableName = + CharArray(4) { + file.readUnsignedByte().toChar() + } + file.skipBytes(4) // checksum + val offset = file.readInt() // technically it's unsigned but we should be okay + val length = file.readInt() // technically it's unsigned but we should be okay + + bytesReadSoFar += 16 + + if (String(tableName) == "head") { + headOffset = offset + } else if (String(tableName) == "name") { + nameOffset = offset + nameLength = length + } + } + + if (headOffset == 0 || nameOffset == 0) { + throw IOException("Could not find head or name table") + } + + if (headOffset < nameOffset) { + file.skipBytes(headOffset - bytesReadSoFar) + bytesReadSoFar = headOffset + bytesReadSoFar += readHeadTable(file, fontDetails) + file.skipBytes(nameOffset - bytesReadSoFar) + readNameTable(file, nameLength, fontDetails) + } else { + file.skipBytes(nameOffset - bytesReadSoFar) + bytesReadSoFar = nameOffset + bytesReadSoFar += readNameTable(file, nameLength, fontDetails) + file.skipBytes(headOffset - bytesReadSoFar) + readHeadTable(file, fontDetails) + } + file.close() + } + + @Suppress("MagicNumber") + private fun readHeadTable(file: DataInputStream, fontDetails: FontMetric): Int { + // Find the details in the head table + file.skipBytes(4) // Fixed version + fontDetails.revision = file.readInt() + file.skipBytes(12) // checksum, magic, flags, units + fontDetails.created = file.readLong() + fontDetails.modified = file.readLong() + return 36 + } + + @Suppress("MagicNumber") + private fun readNameTable( + file: DataInputStream, + tableLength: Int, + fontDetails: FontMetric, + ): Int { + file.skipBytes(2) // format + val numNames = file.readUnsignedShort() + val stringOffset = file.readUnsignedShort() + var bytesReadSoFar = 6 + val nameTable = arrayListOf>() + + for (i in 0 until numNames) { + file.skipBytes(6) // platform id, encoding id, langid + val nameID = file.readUnsignedShort() + val length = file.readUnsignedShort() + val offset = file.readUnsignedShort() + nameTable.add(Triple(nameID, length, offset)) + bytesReadSoFar += 12 + } + + val stringTableSize = min(tableLength - bytesReadSoFar, tableLength - stringOffset) + val stringTable = ByteArray(stringTableSize) + + if (stringTable.size != file.read(stringTable)) { + throw IOException("Did not read entire string table") + } + + bytesReadSoFar += stringTable.size + + // Now we're at the beginning of the string table + for (i in nameTable) { + when (i.first) { + 1 -> fontDetails.family = getString(stringTable, i.third, i.second) + 2 -> fontDetails.subFamily = getString(stringTable, i.third, i.second) + 3 -> fontDetails.uniqueSubFamily = getString(stringTable, i.third, i.second) + 4 -> fontDetails.fullName = getString(stringTable, i.third, i.second) + 5 -> fontDetails.fontVersion = getString(stringTable, i.third, i.second) + } + } + return bytesReadSoFar + } + + private fun getString( + stringTable: ByteArray, + offset: Int, + length: Int, + ): String { + return String(stringTable.copyOfRange(offset, offset + length)) + } + + /** + * Calculate the SHA-256 hash of the file passed + */ + fun calculateFileHash(path: String): String { + return calculateFileHash(FileInputStream(path)) + } + + /** + * Calculate the SHA-256 hash of the InputStream passed + */ + @Suppress("MagicNumber") + private fun calculateFileHash(inputStream: InputStream): String { + try { + val md = MessageDigest.getInstance("SHA-256") + val buffer = ByteArray(8192) + var bytesRead: Int + while (inputStream.read(buffer).also { bytesRead = it } != -1) { + md.update(buffer, 0, bytesRead) + } + val digest = md.digest() + // Convert the byte array to a hexadecimal string + val hashBuilder = StringBuilder() + for (b in digest) { + hashBuilder.append(String.format("%02X", b)) + } + return hashBuilder.toString() + } catch (_: NoSuchAlgorithmException) { + return "sha-256-not-found" + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt index 67fa92f58172..234c59379c2b 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt @@ -28,6 +28,7 @@ import org.mozilla.fenix.browser.readermode.ReaderModeController import org.mozilla.fenix.components.toolbar.interactor.BrowserToolbarInteractor import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.nav +import org.mozilla.fenix.ext.navigateSafe import org.mozilla.fenix.ext.settings import org.mozilla.fenix.home.HomeFragment import org.mozilla.fenix.home.HomeScreenViewModel @@ -221,9 +222,9 @@ class DefaultBrowserToolbarController( } override fun handleTranslationsButtonClick() { - navController.navigate( - BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment(), - ) + val directions = + BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment() + navController.navigateSafe(R.id.browserFragment, directions) } companion object { diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/RedesignToolbarFeature.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/RedesignToolbarFeature.kt new file mode 100644 index 000000000000..2529b038bf47 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/RedesignToolbarFeature.kt @@ -0,0 +1,42 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.toolbar + +import org.mozilla.fenix.utils.Settings + +/** + * An abstraction for the Toolbar Redesign feature. + */ +interface RedesignToolbarFeature { + + /** + * Returns true if the toolbar redesign feature is enabled. + */ + val isEnabled: Boolean +} + +/** + * The complete portions of the redesigned Toolbar ready for Nightly. + * + */ +class CompleteRedesignToolbarFeature( + private val settings: Settings, +) : RedesignToolbarFeature { + + override val isEnabled: Boolean + get() = settings.enableRedesignToolbar +} + +/** + * The incomplete portions of the redesigned Toolbar still in progress. + * + */ +class IncompleteRedesignToolbarFeature( + private val settings: Settings, +) : RedesignToolbarFeature { + + override val isEnabled: Boolean + get() = settings.enableIncompleteToolbarRedesign +} diff --git a/app/src/main/java/org/mozilla/fenix/compose/Image.kt b/app/src/main/java/org/mozilla/fenix/compose/Image.kt index 89a5efc1467f..a9db9f4cadb2 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/Image.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/Image.kt @@ -35,6 +35,10 @@ import org.mozilla.fenix.theme.FirefoxTheme * bounds defined by the width and height. * @param contentScale Optional scale parameter used to determine the aspect ratio scaling to be used * if the bounds are a different size from the intrinsic size of the [Painter]. + * @param placeholder composable displayed while the image is still loading. + * By default set to a solid color in [DefaultImagePlaceholder]. + * @param fallback composable displayed when the image fails loading. + * By default set to a solid color in [DefaultImagePlaceholder]. */ @Composable @Suppress("LongParameterList") @@ -46,9 +50,11 @@ fun Image( contentDescription: String? = null, alignment: Alignment = Alignment.Center, contentScale: ContentScale = ContentScale.Fit, + placeholder: @Composable () -> Unit = { DefaultImagePlaceholder(modifier, contentDescription) }, + fallback: @Composable () -> Unit = { DefaultImagePlaceholder(modifier, contentDescription) }, ) { if (inComposePreview) { - DefaultImagePlaceholder(modifier = modifier) + placeholder() } else { ImageLoader( url = url, @@ -66,9 +72,9 @@ fun Image( ) } - WithDefaultPlaceholder(modifier, contentDescription) + WithPlaceholder(placeholder) - WithDefaultFallback(modifier, contentDescription) + WithFallback(fallback) } } } diff --git a/app/src/main/java/org/mozilla/fenix/compose/ImagesPlaceholder.kt b/app/src/main/java/org/mozilla/fenix/compose/ImagesPlaceholder.kt index 5ba607935598..a0791bc65faf 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/ImagesPlaceholder.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/ImagesPlaceholder.kt @@ -11,6 +11,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.painter.ColorPainter +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import mozilla.components.support.images.compose.loader.Fallback @@ -19,38 +20,32 @@ import mozilla.components.support.images.compose.loader.Placeholder import org.mozilla.fenix.theme.FirefoxTheme /** - * Renders the app default image placeholder while the image is still getting loaded. + * Renders the app image placeholder while the image is still getting loaded. * - * @param modifier [Modifier] allowing to control among others the dimensions and shape of the image. - * @param contentDescription Text provided to accessibility services to describe what this image represents. - * Defaults to [null] suited for an image used only for decorative purposes and not to be read by - * accessibility services. + * @param placeholder [Composable] composable used during loading. + * By default, set to [DefaultImagePlaceholder] in [org.mozilla.fenix.compose.Image]. */ @Composable -internal fun ImageLoaderScope.WithDefaultPlaceholder( - modifier: Modifier, - contentDescription: String? = null, +internal fun ImageLoaderScope.WithPlaceholder( + placeholder: @Composable () -> Unit, ) { Placeholder { - DefaultImagePlaceholder(modifier, contentDescription) + placeholder() } } /** - * Renders the app default image placeholder if loading the image failed. + * Renders the app image placeholder if loading image failed. * - * @param modifier [Modifier] allowing to control among others the dimensions and shape of the image. - * @param contentDescription Text provided to accessibility services to describe what this image represents. - * Defaults to [null] suited for an image used only for decorative purposes and not to be read by - * accessibility services. + * @param fallback [Painter] composable used if loading failed. + * By default, set to [DefaultImagePlaceholder] in [org.mozilla.fenix.compose.Image]. */ @Composable -internal fun ImageLoaderScope.WithDefaultFallback( - modifier: Modifier, - contentDescription: String? = null, +internal fun ImageLoaderScope.WithFallback( + fallback: @Composable () -> Unit, ) { Fallback { - DefaultImagePlaceholder(modifier, contentDescription) + fallback() } } @@ -75,7 +70,7 @@ internal fun DefaultImagePlaceholder( private fun DefaultImagePlaceholderPreview() { FirefoxTheme { DefaultImagePlaceholder( - Modifier + modifier = Modifier .size(200.dp, 100.dp) .clip(RoundedCornerShape(8.dp)), ) diff --git a/app/src/main/java/org/mozilla/fenix/compose/button/FloatingActionButton.kt b/app/src/main/java/org/mozilla/fenix/compose/button/FloatingActionButton.kt index 456167ff8b81..29ed7f83f278 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/button/FloatingActionButton.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/button/FloatingActionButton.kt @@ -12,6 +12,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.material.FloatingActionButton +import androidx.compose.material.FloatingActionButtonDefaults +import androidx.compose.material.FloatingActionButtonElevation import androidx.compose.material.Icon import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -35,6 +37,8 @@ import org.mozilla.fenix.theme.FirefoxTheme * @param modifier [Modifier] to be applied to the action button. * @param contentDescription The content description to describe the icon. * @param label Text to be displayed next to the icon. + * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB in different states. + * This controls the size of the shadow below the FAB. * @param onClick Invoked when the button is clicked. */ @Composable @@ -43,6 +47,7 @@ fun FloatingActionButton( modifier: Modifier = Modifier, contentDescription: String? = null, label: String? = null, + elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(defaultElevation = 5.dp), onClick: () -> Unit, ) { FloatingActionButton( @@ -50,6 +55,7 @@ fun FloatingActionButton( modifier = modifier, backgroundColor = FirefoxTheme.colors.actionPrimary, contentColor = FirefoxTheme.colors.textActionPrimary, + elevation = elevation, ) { Row( modifier = Modifier diff --git a/app/src/main/java/org/mozilla/fenix/compose/list/ListItem.kt b/app/src/main/java/org/mozilla/fenix/compose/list/ListItem.kt index c48722423b6e..0a8e88b1ea7c 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/list/ListItem.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/list/ListItem.kt @@ -19,14 +19,23 @@ import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.res.painterResource +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.semantics.clearAndSetSemantics +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.role +import androidx.compose.ui.semantics.selected import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.mozilla.fenix.R import org.mozilla.fenix.compose.Favicon +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.compose.button.RadioButton import org.mozilla.fenix.theme.FirefoxTheme private val LIST_ITEM_HEIGHT = 56.dp @@ -39,6 +48,7 @@ private val ICON_SIZE = 24.dp * * @param label The label in the list item. * @param modifier [Modifier] to be applied to the layout. + * @param maxLabelLines An optional maximum number of lines for the label text to span. * @param description An optional description text below the label. * @param maxDescriptionLines An optional maximum number of lines for the description text to span. * @param onClick Called when the user clicks on the item. @@ -50,6 +60,7 @@ private val ICON_SIZE = 24.dp fun TextListItem( label: String, modifier: Modifier = Modifier, + maxLabelLines: Int = 1, description: String? = null, maxDescriptionLines: Int = 1, onClick: (() -> Unit)? = null, @@ -59,6 +70,7 @@ fun TextListItem( ) { ListItem( label = label, + maxLabelLines = maxLabelLines, modifier = modifier, description = description, maxDescriptionLines = maxDescriptionLines, @@ -69,7 +81,8 @@ fun TextListItem( onClick = onIconClick, modifier = Modifier .padding(end = 16.dp) - .size(ICON_SIZE), + .size(ICON_SIZE) + .clearAndSetSemantics {}, ) { Icon( painter = iconPainter, @@ -200,12 +213,64 @@ fun IconListItem( ) } +/** + * List item used to display a label with an optional description text and + * a [RadioButton] at the beginning. + * + * @param label The label in the list item. + * @param selected [Boolean] That indicates whether the [RadioButton] is currently selected. + * @param modifier [Modifier] to be applied to the layout. + * @param maxLabelLines An optional maximum number of lines for the label text to span. + * @param description An optional description text below the label. + * @param maxDescriptionLines An optional maximum number of lines for the description text to span. + * @param onClick Called when the user clicks on the item. + */ +@Composable +fun RadioButtonListItem( + label: String, + selected: Boolean, + modifier: Modifier = Modifier, + maxLabelLines: Int = 1, + description: String? = null, + maxDescriptionLines: Int = 1, + onClick: (() -> Unit), +) { + ListItem( + label = label, + modifier = modifier + .clearAndSetSemantics { + this.selected = selected + role = Role.RadioButton + contentDescription = if (description != null) { + "$label.$description" + } else { + label + } + }, + maxLabelLines = maxLabelLines, + description = description, + maxDescriptionLines = maxDescriptionLines, + onClick = onClick, + beforeListAction = { + RadioButton( + selected = selected, + modifier = Modifier + .padding(horizontal = 16.dp) + .size(ICON_SIZE) + .clearAndSetSemantics {}, + onClick = onClick, + ) + }, + ) +} + /** * Base list item used to display a label with an optional description text and * the flexibility to add custom UI to either end of the item. * * @param label The label in the list item. * @param modifier [Modifier] to be applied to the layout. + * @param maxLabelLines An optional maximum number of lines for the label text to span. * @param description An optional description text below the label. * @param maxDescriptionLines An optional maximum number of lines for the description text to span. * @param onClick Called when the user clicks on the item. @@ -216,6 +281,7 @@ fun IconListItem( private fun ListItem( label: String, modifier: Modifier = Modifier, + maxLabelLines: Int = 1, description: String? = null, maxDescriptionLines: Int = 1, onClick: (() -> Unit)? = null, @@ -242,7 +308,7 @@ private fun ListItem( text = label, color = FirefoxTheme.colors.textPrimary, style = FirefoxTheme.typography.subtitle1, - maxLines = 1, + maxLines = maxLabelLines, ) description?.let { @@ -358,3 +424,23 @@ private fun FaviconListItemPreview() { } } } + +@Composable +@LightDarkPreview +private fun RadioButtonListItemPreview() { + val radioOptions = + listOf("Radio button first item", "Radio button second item", "Radio button third item") + val (selectedOption, onOptionSelected) = remember { mutableStateOf(radioOptions[1]) } + FirefoxTheme { + Column(Modifier.background(FirefoxTheme.colors.layer1)) { + radioOptions.forEach { text -> + RadioButtonListItem( + label = text, + description = "$text description", + onClick = { onOptionSelected(text) }, + selected = (text == selectedOption), + ) + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/debugsettings/data/DebugSettingsRepository.kt b/app/src/main/java/org/mozilla/fenix/debugsettings/data/DebugSettingsRepository.kt new file mode 100644 index 000000000000..3b8304e7fbd7 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/debugsettings/data/DebugSettingsRepository.kt @@ -0,0 +1,68 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.debugsettings.data + +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.booleanPreferencesKey +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.preferencesDataStore +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch + +/** + * [DataStore] for accessing debugging settings. + */ +private val Context.debugSettings: DataStore by preferencesDataStore(name = "debug_settings") + +private val debugDrawerEnabledKey = booleanPreferencesKey("debug_drawer_enabled") + +/** + * Cache for accessing any settings related to debugging. + */ +interface DebugSettingsRepository { + + /** + * [Flow] for checking whether the Debug Drawer is enabled. + */ + val debugDrawerEnabled: Flow + + /** + * Updates whether the debug drawer is enabled. + * + * @param enabled Whether the debug drawer is enabled. + */ + fun setDebugDrawerEnabled(enabled: Boolean) +} + +/** + * The default implementation of [DebugSettingsRepository]. + * + * @param context Android context used to obtain the underlying [DataStore]. + * @param dataStore [DataStore] for accessing debugging settings. + * @param writeScope [CoroutineScope] used for writing settings changes to disk. + */ +class DefaultDebugSettingsRepository( + context: Context, + private val dataStore: DataStore = context.debugSettings, + private val writeScope: CoroutineScope, +) : DebugSettingsRepository { + + override val debugDrawerEnabled: Flow = + dataStore.data.map { preferences -> + preferences[debugDrawerEnabledKey] ?: false + } + + override fun setDebugDrawerEnabled(enabled: Boolean) { + writeScope.launch { + dataStore.edit { preferences -> + preferences[debugDrawerEnabledKey] = enabled + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/debugsettings/ui/DebugOverlay.kt b/app/src/main/java/org/mozilla/fenix/debugsettings/ui/DebugOverlay.kt new file mode 100644 index 000000000000..c305da3833d6 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/debugsettings/ui/DebugOverlay.kt @@ -0,0 +1,74 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.debugsettings.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Snackbar +import androidx.compose.material.SnackbarHost +import androidx.compose.material.SnackbarHostState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.launch +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.compose.button.FloatingActionButton +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * Overlay for presenting Fenix-wide debugging content. + */ +@Composable +fun DebugOverlay() { + val snackbarState = remember { SnackbarHostState() } + val scope = rememberCoroutineScope() + + Box( + modifier = Modifier.fillMaxSize(), + ) { + FloatingActionButton( + icon = painterResource(R.drawable.ic_debug_transparent_fire_24), + modifier = Modifier + .align(Alignment.CenterStart) + .padding(start = 16.dp), + onClick = { + scope.launch { + snackbarState.showSnackbar("Show debug drawer") + } + }, + ) + + // This must be the last element in the Box + SnackbarHost( + hostState = snackbarState, + modifier = Modifier.align(Alignment.BottomCenter), + ) { snackbarData -> + Snackbar( + snackbarData = snackbarData, + ) + } + } +} + +@Composable +@LightDarkPreview +private fun DebugOverlayPreview() { + FirefoxTheme { + Box( + modifier = Modifier + .fillMaxSize() + .background(color = FirefoxTheme.colors.layer1), + ) { + DebugOverlay() + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/extension/WebExtensionPromptFeature.kt b/app/src/main/java/org/mozilla/fenix/extension/WebExtensionPromptFeature.kt index 55efb200e613..06de6146621a 100644 --- a/app/src/main/java/org/mozilla/fenix/extension/WebExtensionPromptFeature.kt +++ b/app/src/main/java/org/mozilla/fenix/extension/WebExtensionPromptFeature.kt @@ -161,7 +161,9 @@ class WebExtensionPromptFeature( return } - is WebExtensionInstallException.Unknown -> { + is WebExtensionInstallException.UnsupportedAddonType, + is WebExtensionInstallException.Unknown, + -> { // Making sure we don't have a // Title = Failed to install // Message = Failed to install $addonName diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeMenuView.kt b/app/src/main/java/org/mozilla/fenix/home/HomeMenuView.kt index 81c28352ec34..6a2dfedf7900 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeMenuView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeMenuView.kt @@ -76,6 +76,18 @@ class HomeMenuView( ThemeManager.resolveAttribute(R.attr.textPrimary, context), ), ) + + menuButton.get()?.register( + object : mozilla.components.concept.menu.MenuButton.Observer { + override fun onShow() { + // MenuButton used in [HomeMenuView] doesn't emit toolbar facts. + // A wrapper is responsible for that, but we are using the button + // directly, hence recording the event directly. + // Should investigate further: https://bugzilla.mozilla.org/show_bug.cgi?id=1868207 + Events.toolbarMenuVisible.record(NoExtras()) + } + }, + ) } /** diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt index da17a8b196bb..3e7e9ddee74d 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt @@ -55,6 +55,7 @@ internal fun normalModeAdapterItems( } if (settings.showTopSitesFeature && topSites.isNotEmpty()) { + shouldShowCustomizeHome = true if (settings.enableComposeTopSites) { items.add(AdapterItem.TopSites) } else { diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt index 4cf844495db0..924695f6ede5 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt @@ -139,6 +139,10 @@ class BookmarkFragmentInteractor( BookmarkNodeType.ITEM -> { bookmarksController.handleBookmarkTapped(item) BookmarksManagement.open.record(NoExtras()) + MetricsUtils.recordBookmarkMetrics( + MetricsUtils.BookmarkAction.OPEN, + METRIC_SOURCE, + ) } BookmarkNodeType.FOLDER -> bookmarksController.handleBookmarkExpand(item) BookmarkNodeType.SEPARATOR -> throw IllegalStateException("Cannot open separators") diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt index 4a910fc31253..fe46380044ce 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt @@ -36,7 +36,7 @@ class BookmarkItemMenu( @VisibleForTesting @SuppressWarnings("LongMethod") internal suspend fun menuItems(itemType: BookmarkNodeType, itemId: String): List { - val hasAtLeastOneChild = !context.bookmarkStorage.getTree(itemId)?.children.isNullOrEmpty() + val hasAtLeastOneChild = !context.bookmarkStorage.getTree(itemId, false)?.children.isNullOrEmpty() return listOfNotNull( if (itemType != BookmarkNodeType.SEPARATOR) { diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/DesktopFolders.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/DesktopFolders.kt index 19f83fa87240..f0cd4e8f0e9c 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/DesktopFolders.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/DesktopFolders.kt @@ -49,6 +49,15 @@ class DesktopFolders( } } + /** + * Return the total number of desktop bookmarks in the storage database. + */ + suspend fun count(): Int { + return bookmarksStorage.countBookmarksInTrees( + listOf(BookmarkRoot.Menu.id, BookmarkRoot.Toolbar.id, BookmarkRoot.Unfiled.id), + ).toInt() + } + private suspend fun virtualDesktopFolder(): BookmarkNode? { val rootNode = bookmarksStorage.getTree(BookmarkRoot.Root.id, recursive = false) ?: return null return rootNode.copy(title = rootTitles[rootNode.title]) diff --git a/app/src/main/java/org/mozilla/fenix/messaging/CustomAttributeProvider.kt b/app/src/main/java/org/mozilla/fenix/messaging/CustomAttributeProvider.kt index 4facd60db46c..621ef144cc7e 100644 --- a/app/src/main/java/org/mozilla/fenix/messaging/CustomAttributeProvider.kt +++ b/app/src/main/java/org/mozilla/fenix/messaging/CustomAttributeProvider.kt @@ -35,11 +35,14 @@ object CustomAttributeProvider : JexlAttributeProvider { * will unlikely to targeted as expected. */ fun getCustomTargetingAttributes(context: Context): JSONObject { - val isFirstRun = context.settings().isFirstNimbusRun + val settings = context.settings() + val isFirstRun = settings.isFirstNimbusRun + val isReviewCheckerEnabled = settings.isReviewQualityCheckEnabled return JSONObject( mapOf( // By convention, we should use snake case. "is_first_run" to isFirstRun, + "is_review_checker_enabled" to isReviewCheckerEnabled, // This camelCase attribute is a boolean value represented as a string. // This is left for backwards compatibility. @@ -74,7 +77,8 @@ object CustomAttributeProvider : JexlAttributeProvider { UTM_TERM to settings.utmTerm, UTM_CONTENT to settings.utmContent, - "are_notifications_enabled" to NotificationManagerCompat.from(context).areNotificationsEnabledSafe(), + "are_notifications_enabled" to NotificationManagerCompat.from(context) + .areNotificationsEnabledSafe(), ), ) } diff --git a/app/src/main/java/org/mozilla/fenix/messaging/MessageNotificationWorker.kt b/app/src/main/java/org/mozilla/fenix/messaging/MessageNotificationWorker.kt index 3e922ec6f852..4d8d9ade4a15 100644 --- a/app/src/main/java/org/mozilla/fenix/messaging/MessageNotificationWorker.kt +++ b/app/src/main/java/org/mozilla/fenix/messaging/MessageNotificationWorker.kt @@ -12,10 +12,10 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.os.IBinder +import androidx.work.CoroutineWorker import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkManager -import androidx.work.Worker import androidx.work.WorkerParameters import mozilla.components.service.nimbus.messaging.FxNimbusMessaging import mozilla.components.service.nimbus.messaging.Message @@ -32,21 +32,21 @@ const val CLICKED_MESSAGE_ID = "clickedMessageId" const val DISMISSED_MESSAGE_ID = "dismissedMessageId" /** - * Background [Worker] that polls Nimbus for available [Message]s at a given interval. + * Background [CoroutineWorker] that polls Nimbus for available [Message]s at a given interval. * A [Notification] will be created using the configuration of the next highest priority [Message] * if it has not already been displayed. */ class MessageNotificationWorker( context: Context, workerParameters: WorkerParameters, -) : Worker(context, workerParameters) { +) : CoroutineWorker(context, workerParameters) { @SuppressWarnings("ReturnCount") - override fun doWork(): Result { + override suspend fun doWork(): Result { val context = applicationContext val messagingStorage = context.components.analytics.messagingStorage - val messages = runBlockingIncrement { messagingStorage.getMessages() } + val messages = messagingStorage.getMessages() val nextMessage = messagingStorage.getNextMessage(FenixMessageSurfaceId.NOTIFICATION, messages) ?: return Result.success() @@ -67,7 +67,7 @@ class MessageNotificationWorker( currentBootUniqueIdentifier, ) - runBlockingIncrement { nimbusMessagingController.onMessageDisplayed(updatedMessage) } + nimbusMessagingController.onMessageDisplayed(updatedMessage) context.components.notificationsDelegate.notify( MESSAGE_TAG, @@ -137,7 +137,7 @@ class MessageNotificationWorker( private const val MESSAGE_WORK_NAME = "org.mozilla.fenix.message.work" /** - * Initialize the [Worker] to begin polling Nimbus. + * Initialize the [CoroutineWorker] to begin polling Nimbus. */ fun setMessageNotificationWorker(context: Context) { val messaging = FxNimbusMessaging.features.messaging diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/JunoOnboardingFragment.kt b/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingFragment.kt similarity index 93% rename from app/src/main/java/org/mozilla/fenix/onboarding/JunoOnboardingFragment.kt rename to app/src/main/java/org/mozilla/fenix/onboarding/OnboardingFragment.kt index 1766017be979..3791607f4ae8 100644 --- a/app/src/main/java/org/mozilla/fenix/onboarding/JunoOnboardingFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingFragment.kt @@ -33,8 +33,8 @@ import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.openSetDefaultBrowserOption import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.nimbus.FxNimbus -import org.mozilla.fenix.onboarding.view.JunoOnboardingScreen import org.mozilla.fenix.onboarding.view.OnboardingPageUiData +import org.mozilla.fenix.onboarding.view.OnboardingScreen import org.mozilla.fenix.onboarding.view.sequencePosition import org.mozilla.fenix.onboarding.view.telemetrySequenceId import org.mozilla.fenix.onboarding.view.toPageUiData @@ -43,9 +43,9 @@ import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.gecko.search.SearchWidgetProvider /** - * Fragment displaying the juno onboarding flow. + * Fragment displaying the onboarding flow. */ -class JunoOnboardingFragment : Fragment() { +class OnboardingFragment : Fragment() { private val pagesToDisplay by lazy { pagesToDisplay( @@ -53,7 +53,7 @@ class JunoOnboardingFragment : Fragment() { canShowAddWidgetCard(), ) } - private val telemetryRecorder by lazy { JunoOnboardingTelemetryRecorder() } + private val telemetryRecorder by lazy { OnboardingTelemetryRecorder() } private val pinAppWidgetReceiver = WidgetPinnedReceiver() @SuppressLint("SourceLockedOrientationActivity") @@ -98,7 +98,7 @@ class JunoOnboardingFragment : Fragment() { @Suppress("LongMethod") private fun ScreenContent() { val context = LocalContext.current - JunoOnboardingScreen( + OnboardingScreen( pagesToDisplay = pagesToDisplay, onMakeFirefoxDefaultClick = { activity?.openSetDefaultBrowserOption(useCustomTab = true) @@ -127,8 +127,8 @@ class JunoOnboardingFragment : Fragment() { }, onSignInButtonClick = { findNavController().nav( - id = R.id.junoOnboardingFragment, - directions = JunoOnboardingFragmentDirections.actionGlobalTurnOnSync( + id = R.id.onboardingFragment, + directions = OnboardingFragmentDirections.actionGlobalTurnOnSync( entrypoint = FenixFxAEntryPoint.NewUserOnboarding, ), ) @@ -203,8 +203,8 @@ class JunoOnboardingFragment : Fragment() { private fun onFinish(sequenceId: String, sequencePosition: String) { requireComponents.fenixOnboarding.finish() findNavController().nav( - id = R.id.junoOnboardingFragment, - directions = JunoOnboardingFragmentDirections.actionHome(), + id = R.id.onboardingFragment, + directions = OnboardingFragmentDirections.actionHome(), ) telemetryRecorder.onOnboardingComplete( sequenceId = sequenceId, @@ -224,8 +224,7 @@ class JunoOnboardingFragment : Fragment() { showNotificationPage: Boolean, showAddWidgetPage: Boolean, ): List { - val junoOnboardingFeature = FxNimbus.features.junoOnboarding.value() - val jexlConditions = junoOnboardingFeature.conditions + val jexlConditions = FxNimbus.features.junoOnboarding.value().conditions val jexlHelper = requireContext().components.analytics.messagingStorage.helper return FxNimbus.features.junoOnboarding.value().cards.values.toPageUiData( diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/JunoOnboardingTelemetryRecorder.kt b/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingTelemetryRecorder.kt similarity index 98% rename from app/src/main/java/org/mozilla/fenix/onboarding/JunoOnboardingTelemetryRecorder.kt rename to app/src/main/java/org/mozilla/fenix/onboarding/OnboardingTelemetryRecorder.kt index c820a9df852c..9acbb7944039 100644 --- a/app/src/main/java/org/mozilla/fenix/onboarding/JunoOnboardingTelemetryRecorder.kt +++ b/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingTelemetryRecorder.kt @@ -8,9 +8,9 @@ import org.mozilla.fenix.GleanMetrics.Onboarding import org.mozilla.fenix.onboarding.view.OnboardingPageUiData /** - * Abstraction responsible for recording telemetry events for JunoOnboarding. + * Abstraction responsible for recording telemetry events for Onboarding. */ -class JunoOnboardingTelemetryRecorder { +class OnboardingTelemetryRecorder { /** * Records "onboarding_completed" telemetry event. diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/WidgetPinnedReceiver.kt b/app/src/main/java/org/mozilla/fenix/onboarding/WidgetPinnedReceiver.kt index a036f166844d..ee5acae1352d 100644 --- a/app/src/main/java/org/mozilla/fenix/onboarding/WidgetPinnedReceiver.kt +++ b/app/src/main/java/org/mozilla/fenix/onboarding/WidgetPinnedReceiver.kt @@ -14,11 +14,11 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import mozilla.components.support.utils.PendingIntentUtils -import org.mozilla.fenix.onboarding.view.JunoOnboardingScreen +import org.mozilla.fenix.onboarding.view.OnboardingScreen /** * Receiver required to catch callback from Launcher when prompted - * to add search widget from the Juno Onboarding. + * to add search widget from Onboarding. */ class WidgetPinnedReceiver : BroadcastReceiver() { @@ -44,7 +44,7 @@ class WidgetPinnedReceiver : BroadcastReceiver() { /** * Object containing boolean that updates behavior of Add Search Widget - * card from [JunoOnboardingScreen]. + * card from [OnboardingScreen]. * - True if widget added successfully and app resumed from launcher add widget dialog. * - False if dialog opened but widget was not added. */ diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/view/JunoOnboardingMapper.kt b/app/src/main/java/org/mozilla/fenix/onboarding/view/OnboardingMapper.kt similarity index 100% rename from app/src/main/java/org/mozilla/fenix/onboarding/view/JunoOnboardingMapper.kt rename to app/src/main/java/org/mozilla/fenix/onboarding/view/OnboardingMapper.kt diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/view/JunoOnboardingScreen.kt b/app/src/main/java/org/mozilla/fenix/onboarding/view/OnboardingScreen.kt similarity index 98% rename from app/src/main/java/org/mozilla/fenix/onboarding/view/JunoOnboardingScreen.kt rename to app/src/main/java/org/mozilla/fenix/onboarding/view/OnboardingScreen.kt index 14fabbb8ff12..6f3bb73def5b 100644 --- a/app/src/main/java/org/mozilla/fenix/onboarding/view/JunoOnboardingScreen.kt +++ b/app/src/main/java/org/mozilla/fenix/onboarding/view/OnboardingScreen.kt @@ -43,7 +43,7 @@ import org.mozilla.fenix.onboarding.WidgetPinnedReceiver.WidgetPinnedState import org.mozilla.fenix.theme.FirefoxTheme /** - * A screen for displaying juno onboarding. + * A screen for displaying onboarding. * * @param pagesToDisplay List of pages to be displayed in onboarding pager ui. * @param onMakeFirefoxDefaultClick Invoked when positive button on default browser page is clicked. @@ -61,7 +61,7 @@ import org.mozilla.fenix.theme.FirefoxTheme */ @Composable @Suppress("LongParameterList", "LongMethod") -fun JunoOnboardingScreen( +fun OnboardingScreen( pagesToDisplay: List, onMakeFirefoxDefaultClick: () -> Unit, onSkipDefaultClick: () -> Unit, @@ -116,7 +116,7 @@ fun JunoOnboardingScreen( } } - JunoOnboardingContent( + OnboardingContent( pagesToDisplay = pagesToDisplay, pagerState = pagerState, onMakeFirefoxDefaultClick = { @@ -162,7 +162,7 @@ fun JunoOnboardingScreen( @Composable @Suppress("LongParameterList") -private fun JunoOnboardingContent( +private fun OnboardingContent( pagesToDisplay: List, pagerState: PagerState, onMakeFirefoxDefaultClick: () -> Unit, @@ -241,10 +241,10 @@ private class DisableForwardSwipeNestedScrollConnection( @LightDarkPreview @Composable -private fun JunoOnboardingScreenPreview() { +private fun OnboardingScreenPreview() { val pageCount = defaultPreviewPages().size FirefoxTheme { - JunoOnboardingContent( + OnboardingContent( pagesToDisplay = defaultPreviewPages(), pagerState = rememberPagerState(initialPage = 0) { pageCount diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt index 8a033baa449c..74e830fce94b 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt @@ -28,11 +28,9 @@ import org.mozilla.fenix.R import org.mozilla.fenix.components.Core import org.mozilla.fenix.components.metrics.MetricsUtils import org.mozilla.fenix.crashes.CrashListActivity -import org.mozilla.fenix.ext.application import org.mozilla.fenix.ext.navigateSafe import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.telemetryName -import org.mozilla.fenix.search.awesomebar.AwesomeBarView.Companion.GOOGLE_SEARCH_ENGINE_NAME import org.mozilla.fenix.search.toolbar.SearchSelectorInteractor import org.mozilla.fenix.search.toolbar.SearchSelectorMenu import org.mozilla.fenix.settings.SupportUtils @@ -114,12 +112,6 @@ class SearchDialogController( val searchEngine = fragmentStore.state.searchEngineSource.searchEngine val isDefaultEngine = searchEngine == fragmentStore.state.defaultEngine - val additionalHeaders = getAdditionalHeaders(searchEngine) - val flags = if (additionalHeaders.isNullOrEmpty()) { - LoadUrlFlags.none() - } else { - LoadUrlFlags.select(LoadUrlFlags.ALLOW_ADDITIONAL_HEADERS) - } activity.openToBrowserAndLoad( searchTermOrURL = url, @@ -127,9 +119,7 @@ class SearchDialogController( from = BrowserDirection.FromSearchDialog, engine = searchEngine, forceSearch = !isDefaultEngine, - flags = flags, requestDesktopMode = fromHomeScreen && activity.settings().openNextTabInDesktopMode, - additionalHeaders = additionalHeaders, ) if (url.isUrl() || searchEngine == null) { @@ -195,12 +185,6 @@ class SearchDialogController( clearToolbarFocus() val searchEngine = fragmentStore.state.searchEngineSource.searchEngine - val additionalHeaders = getAdditionalHeaders(searchEngine) - val flags = if (additionalHeaders.isNullOrEmpty()) { - LoadUrlFlags.none() - } else { - LoadUrlFlags.select(LoadUrlFlags.ALLOW_ADDITIONAL_HEADERS) - } activity.openToBrowserAndLoad( searchTermOrURL = searchTerms, @@ -208,8 +192,6 @@ class SearchDialogController( from = BrowserDirection.FromSearchDialog, engine = searchEngine, forceSearch = true, - flags = flags, - additionalHeaders = additionalHeaders, ) val searchAccessPoint = when (fragmentStore.state.searchAccessPoint) { @@ -344,20 +326,4 @@ class SearchDialogController( create().withCenterAlignedButtons() } } - - private fun getAdditionalHeaders(searchEngine: SearchEngine?): Map? { - if (searchEngine?.name != GOOGLE_SEARCH_ENGINE_NAME) { - return null - } - - val value = if (activity.applicationContext.application.isDeviceRamAboveThreshold) { - "1" - } else { - "0" - } - - return mapOf( - "X-Search-Subdivision" to value, - ) - } } diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt index 82181df20420..84d527b1b5ad 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt @@ -74,6 +74,7 @@ import mozilla.components.ui.autocomplete.InlineAutocompleteEditText import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.Awesomebar +import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.VoiceSearch import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R @@ -863,6 +864,8 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { return } + Events.browserToolbarQrScanTapped.record(NoExtras()) + view?.hideKeyboard() toolbarView.view.clearFocus() diff --git a/app/src/main/java/org/mozilla/fenix/settings/SecretDebugSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SecretDebugSettingsFragment.kt index 3f2b9834200f..a27c43ad776c 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SecretDebugSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SecretDebugSettingsFragment.kt @@ -10,14 +10,16 @@ import android.view.View import android.view.ViewGroup import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding -import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.fragment.app.Fragment +import mozilla.components.browser.state.search.RegionState +import mozilla.components.lib.state.ext.observeAsState import org.mozilla.fenix.R import org.mozilla.fenix.components.components import org.mozilla.fenix.ext.showToolbar @@ -39,7 +41,7 @@ class SecretDebugSettingsFragment : Fragment() { return ComposeView(requireContext()).apply { setContent { FirefoxTheme { - DebugInfo() + SecretDebugSettingsScreen() } } } @@ -47,33 +49,41 @@ class SecretDebugSettingsFragment : Fragment() { } @Composable -private fun DebugInfo() { - val store = components.core.store +private fun SecretDebugSettingsScreen() { + val regionState: RegionState by components.core.store.observeAsState( + initialValue = RegionState.Default, + map = { it.search.region ?: RegionState.Default }, + ) + DebugInfo(regionState = regionState) +} + +@Composable +private fun DebugInfo(regionState: RegionState) { Column( modifier = Modifier .padding(8.dp), ) { Text( text = stringResource(R.string.debug_info_region_home), - style = MaterialTheme.typography.h6, - color = MaterialTheme.colors.onBackground, + color = FirefoxTheme.colors.textPrimary, + style = FirefoxTheme.typography.headline6, modifier = Modifier.padding(4.dp), ) Text( - text = store.state.search.region?.home ?: "Unknown", - color = MaterialTheme.colors.onBackground, + text = regionState.home, + color = FirefoxTheme.colors.textPrimary, modifier = Modifier.padding(4.dp), ) Text( text = stringResource(R.string.debug_info_region_current), - style = MaterialTheme.typography.h6, - color = MaterialTheme.colors.onBackground, + color = FirefoxTheme.colors.textPrimary, + style = FirefoxTheme.typography.headline6, modifier = Modifier.padding(4.dp), ) Text( - text = store.state.search.region?.current ?: "Unknown", - color = MaterialTheme.colors.onBackground, + text = regionState.current, + color = FirefoxTheme.colors.textPrimary, modifier = Modifier.padding(4.dp), ) } diff --git a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt index 6721dd81ad76..86b2aabebeed 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt @@ -6,15 +6,19 @@ package org.mozilla.fenix.settings import android.os.Bundle import androidx.core.content.edit +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.preference.EditTextPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreference +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R +import org.mozilla.fenix.debugsettings.data.DefaultDebugSettingsRepository import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.settings @@ -28,6 +32,11 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + val debugSettingsRepository = DefaultDebugSettingsRepository( + context = requireContext(), + writeScope = lifecycleScope, + ) + setPreferencesFromResource(R.xml.secret_settings_preferences, rootKey) requirePreference(R.string.pref_key_allow_third_party_root_certs).apply { @@ -48,6 +57,12 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { onPreferenceChangeListener = SharedPreferenceUpdater() } + requirePreference(R.string.pref_key_toolbar_use_redesign_incomplete).apply { + isVisible = Config.channel.isDebug + isChecked = context.settings().enableIncompleteToolbarRedesign + onPreferenceChangeListener = SharedPreferenceUpdater() + } + requirePreference(R.string.pref_key_enable_tabs_tray_to_compose).apply { isVisible = true isChecked = context.settings().enableTabsTrayToCompose @@ -86,6 +101,25 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { } } + requirePreference(R.string.pref_key_should_enable_felt_privacy).apply { + isVisible = true + isChecked = context.settings().feltPrivateBrowsingEnabled + onPreferenceChangeListener = SharedPreferenceUpdater() + } + + lifecycleScope.launch { + // During initial development, this will only be available in Nightly or Debug builds. + requirePreference(R.string.pref_key_enable_debug_drawer).apply { + isVisible = Config.channel.isNightlyOrDebug + isChecked = debugSettingsRepository.debugDrawerEnabled.first() + onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { _, newValue -> + debugSettingsRepository.setDebugDrawerEnabled(enabled = newValue as Boolean) + true + } + } + } + // for performance reasons, this is only available in Nightly or Debug builds requirePreference(R.string.pref_key_custom_glean_server_url).apply { isVisible = Config.channel.isNightlyOrDebug && BuildConfig.GLEAN_CUSTOM_URL.isNullOrEmpty() diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index 4f2461d4a1d8..118662dacd7e 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -36,6 +36,7 @@ import mozilla.components.concept.sync.AccountObserver import mozilla.components.concept.sync.AuthType import mozilla.components.concept.sync.OAuthAccount import mozilla.components.concept.sync.Profile +import mozilla.components.feature.addons.ui.AddonFilePicker import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.ktx.android.view.showKeyboard import mozilla.components.ui.widgets.withCenterAlignedButtons @@ -70,6 +71,7 @@ class SettingsFragment : PreferenceFragmentCompat() { private val args by navArgs() private lateinit var accountUiView: AccountUiView + private lateinit var addonFilePicker: AddonFilePicker private val profilerViewModel: ProfilerViewModel by activityViewModels() @VisibleForTesting @@ -107,6 +109,9 @@ class SettingsFragment : PreferenceFragmentCompat() { updateFxAAllowDomesticChinaServerMenu = ::updateFxAAllowDomesticChinaServerMenu, ) + addonFilePicker = AddonFilePicker(requireContext(), requireComponents.addonManager) + addonFilePicker.registerForResults(this) + // It's important to update the account UI state in onCreate since that ensures we'll never // display an incorrect state in the UI. We take care to not also call it as part of onResume // if it was just called here (via the 'creatingFragment' flag). @@ -386,6 +391,10 @@ class SettingsFragment : PreferenceFragmentCompat() { resources.getString(R.string.pref_key_nimbus_experiments) -> { SettingsFragmentDirections.actionSettingsFragmentToNimbusExperimentsFragment() } + resources.getString(R.string.pref_key_install_local_addon) -> { + addonFilePicker.launch() + null + } resources.getString(R.string.pref_key_override_amo_collection) -> { val context = requireContext() val dialogView = LayoutInflater.from(context).inflate(R.layout.amo_collection_override_dialog, null) @@ -488,6 +497,7 @@ class SettingsFragment : PreferenceFragmentCompat() { (requireContext().components.core.engine.profiler?.isProfilerActive() != null) } setupCookieBannerPreference() + setupInstallAddonFromFilePreference(requireContext().settings()) setupAmoCollectionOverridePreference(requireContext().settings()) setupGeckoLogsPreference(requireContext().settings()) setupAllowDomesticChinaFxaServerPreference() @@ -698,6 +708,16 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + @VisibleForTesting + internal fun setupInstallAddonFromFilePreference(settings: Settings) { + with(requirePreference(R.string.pref_key_install_local_addon)) { + // Below Android 10, the OS doesn't seem to recognize + // the "application/x-xpinstall" mime type (for XPI files). + isVisible = + settings.showSecretDebugMenuThisSession && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q + } + } + @VisibleForTesting internal fun setupHttpsOnlyPreferences() { val httpsOnlyPreference = diff --git a/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt index 660e82db2bb0..6851434d31e8 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt @@ -11,6 +11,7 @@ import androidx.preference.CheckBoxPreference import androidx.preference.DropDownPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreference import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.TrackingProtection import org.mozilla.fenix.HomeActivity @@ -103,6 +104,16 @@ class TrackingProtectionFragment : PreferenceFragmentCompat() { val preferenceExceptions = requirePreference(R.string.pref_key_tracking_protection_exceptions) preferenceExceptions.onPreferenceClickListener = exceptionsClickListener + + requirePreference(R.string.pref_key_privacy_enable_global_privacy_control).apply { + onPreferenceChangeListener = object : SharedPreferenceUpdater() { + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + context.components.core.engine.settings.globalPrivacyControlEnabled = newValue as Boolean + context.components.useCases.sessionUseCases.reload.invoke() + return super.onPreferenceChange(preference, newValue) + } + } + } } private fun bindTrackingProtectionRadio( diff --git a/app/src/main/java/org/mozilla/fenix/shopping/di/ReviewQualityCheckMiddlewareProvider.kt b/app/src/main/java/org/mozilla/fenix/shopping/di/ReviewQualityCheckMiddlewareProvider.kt index 946ff852c15b..1178cbb77c75 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/di/ReviewQualityCheckMiddlewareProvider.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/di/ReviewQualityCheckMiddlewareProvider.kt @@ -13,6 +13,7 @@ import org.mozilla.fenix.shopping.DefaultShoppingExperienceFeature import org.mozilla.fenix.shopping.middleware.DefaultNetworkChecker import org.mozilla.fenix.shopping.middleware.DefaultReviewQualityCheckPreferences import org.mozilla.fenix.shopping.middleware.DefaultReviewQualityCheckService +import org.mozilla.fenix.shopping.middleware.DefaultReviewQualityCheckTelemetryService import org.mozilla.fenix.shopping.middleware.DefaultReviewQualityCheckVendorsService import org.mozilla.fenix.shopping.middleware.GetReviewQualityCheckSumoUrl import org.mozilla.fenix.shopping.middleware.ReviewQualityCheckNavigationMiddleware diff --git a/app/src/main/java/org/mozilla/fenix/shopping/middleware/EnumMapper.kt b/app/src/main/java/org/mozilla/fenix/shopping/middleware/EnumMapper.kt index 610decc09171..37acb01d058b 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/middleware/EnumMapper.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/middleware/EnumMapper.kt @@ -5,8 +5,8 @@ package org.mozilla.fenix.shopping.middleware /** - * Converts a string to an enum value, ignoring case. If the string does not match any of the - * enum values, the default value is returned. + * Converts a string to an enum value, ignoring case and replacing spaces with underscores. + * If the string does not match any of the enum values, the default value is returned. */ inline fun > String.asEnumOrDefault(defaultValue: T? = null): T? = - enumValues().firstOrNull { it.name.equals(this, ignoreCase = true) } ?: defaultValue + enumValues().firstOrNull { it.name.equals(this.replace(" ", "_"), ignoreCase = true) } ?: defaultValue diff --git a/app/src/main/java/org/mozilla/fenix/shopping/middleware/ProductAnalysisMapper.kt b/app/src/main/java/org/mozilla/fenix/shopping/middleware/ProductAnalysisMapper.kt index e08d7740f712..f9acdd4c9897 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/middleware/ProductAnalysisMapper.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/middleware/ProductAnalysisMapper.kt @@ -27,6 +27,10 @@ private fun ProductAnalysis.toProductReview(): ProductReviewState = } else { ProductReviewState.Error.GenericError } + } else if (deletedProductReported) { + ProductReviewState.Error.ProductAlreadyReported + } else if (deletedProduct) { + ProductReviewState.Error.ProductNotAvailable } else if (notEnoughReviews && !needsAnalysis) { ProductReviewState.Error.NotEnoughReviews } else { @@ -50,8 +54,8 @@ private fun ProductAnalysis.toProductReview(): ProductReviewState = private fun Boolean.toAnalysisStatus(): AnalysisStatus = when (this) { - true -> AnalysisStatus.NEEDS_ANALYSIS - false -> AnalysisStatus.UP_TO_DATE + true -> AnalysisStatus.NeedsAnalysis + false -> AnalysisStatus.UpToDate } private fun Highlight.toHighlights(): Map>? = @@ -68,7 +72,4 @@ private fun Highlight.highlightsForType(highlightType: HighlightType) = HighlightType.SHIPPING -> shipping HighlightType.PACKAGING_AND_APPEARANCE -> appearance HighlightType.COMPETITIVENESS -> competitiveness - }?.map { it.surroundWithQuotes() } - -private fun String.surroundWithQuotes(): String = - "\"$this\"" + } diff --git a/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckNetworkMiddleware.kt b/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckNetworkMiddleware.kt index a84318936716..d461c57f084a 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckNetworkMiddleware.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckNetworkMiddleware.kt @@ -56,79 +56,102 @@ class ReviewQualityCheckNetworkMiddleware( scope.launch { when (action) { FetchProductAnalysis, RetryProductAnalysis -> { - val productAnalysis = reviewQualityCheckService.fetchProductReview() - val productReviewState = productAnalysis.toProductReviewState() - - // Here the ProductReviewState should only updated after the analysis status API - // returns a result. This makes sure that the UI doesn't show the reanalyse - // button in case the product analysis is already in progress on the backend. - if (productReviewState.isAnalysisPresentOrNoAnalysisPresent() && - reviewQualityCheckService.analysisStatus().isPendingOrInProgress() - ) { - store.updateProductReviewState(productReviewState, true) - store.dispatch(ReviewQualityCheckAction.RestoreReanalysis) - } else { - store.updateProductReviewState(productReviewState) - } - - if (productReviewState is ProductReviewState.AnalysisPresent) { - store.updateRecommendedProductState() - } + store.onFetch() } ReviewQualityCheckAction.ReanalyzeProduct, ReviewQualityCheckAction.AnalyzeProduct, ReviewQualityCheckAction.RestoreReanalysis, -> { - val reanalysis = reviewQualityCheckService.reanalyzeProduct() + store.onReanalyze() + } - if (reanalysis == null) { - store.updateProductReviewState(ProductReviewState.Error.GenericError) - return@launch + ReviewQualityCheckAction.ReportProductBackInStock -> { + val status = reviewQualityCheckService.reportBackInStock() + if (status == ReportBackInStockStatusDto.NOT_DELETED) { + store.onFetch() } + } - val status = pollForAnalysisStatus() - - if (status == null || - status == AnalysisStatusDto.PENDING || - status == AnalysisStatusDto.IN_PROGRESS + ReviewQualityCheckAction.ToggleProductRecommendation -> { + val state = store.state + if (state is ReviewQualityCheckState.OptedIn && + state.productReviewState is ProductReviewState.AnalysisPresent && + state.productRecommendationsPreference == true ) { - // poll failed, reset to previous state - val state = store.state - if (state is ReviewQualityCheckState.OptedIn) { - if (state.productReviewState is ProductReviewState.NoAnalysisPresent) { - store.updateProductReviewState(ProductReviewState.NoAnalysisPresent()) - } else if (state.productReviewState is ProductReviewState.AnalysisPresent) { - store.updateProductReviewState( - state.productReviewState.copy( - analysisStatus = AnalysisStatus.NEEDS_ANALYSIS, - ), - ) - } - } - } else { - // poll succeeded, update state - val productAnalysis = reviewQualityCheckService.fetchProductReview() - val productReviewState = productAnalysis.toProductReviewState() - store.updateProductReviewState(productReviewState) + store.updateRecommendedProductState() } } + } + } + } - is ReviewQualityCheckAction.RecommendedProductClick -> { - reviewQualityCheckService.recordRecommendedProductClick(action.productAid) - } + private suspend fun Store.onFetch() { + val productAnalysis = reviewQualityCheckService.fetchProductReview() + val productReviewState = productAnalysis.toProductReviewState() - is ReviewQualityCheckAction.RecommendedProductImpression -> { - reviewQualityCheckService.recordRecommendedProductImpression(action.productAid) + // Here the ProductReviewState should only updated after the analysis status API + // returns a result. This makes sure that the UI doesn't show the reanalyse + // button in case the product analysis is already in progress on the backend. + if (productReviewState.isAnalysisPresentOrNoAnalysisPresent() && + reviewQualityCheckService.analysisStatus()?.status.isPendingOrInProgress() + ) { + updateProductReviewState(productReviewState, true) + dispatch(ReviewQualityCheckAction.RestoreReanalysis) + } else { + updateProductReviewState(productReviewState) + } + + if (productReviewState is ProductReviewState.AnalysisPresent) { + updateRecommendedProductState() + } + } + + private suspend fun Store.onReanalyze() { + val reanalysis = reviewQualityCheckService.reanalyzeProduct() + + if (reanalysis == null) { + updateProductReviewState(ProductReviewState.Error.GenericError) + return + } + + val statusProgress = pollForAnalysisStatus { + dispatch(ReviewQualityCheckAction.UpdateAnalysisProgress(it)) + } + + if (statusProgress == null || + statusProgress.status == AnalysisStatusDto.PENDING || + statusProgress.status == AnalysisStatusDto.IN_PROGRESS + ) { + // poll failed, reset to previous state + val state = this.state + if (state is ReviewQualityCheckState.OptedIn) { + if (state.productReviewState is ProductReviewState.NoAnalysisPresent) { + updateProductReviewState(ProductReviewState.NoAnalysisPresent()) + } else if (state.productReviewState is ProductReviewState.AnalysisPresent) { + updateProductReviewState( + state.productReviewState.copy(analysisStatus = AnalysisStatus.NeedsAnalysis), + ) } } + } else { + // poll succeeded, update state + val productAnalysis = reviewQualityCheckService.fetchProductReview() + val productReviewState = productAnalysis.toProductReviewState() + updateProductReviewState(productReviewState) } } - private suspend fun pollForAnalysisStatus(): AnalysisStatusDto? = + private suspend fun pollForAnalysisStatus( + onEachSuccessfulPoll: (progress: Double) -> Unit, + ): AnalysisStatusProgressDto? = retry( - predicate = { it.isPendingOrInProgress() }, - block = { reviewQualityCheckService.analysisStatus() }, + predicate = { it?.status.isPendingOrInProgress() }, + block = { + reviewQualityCheckService.analysisStatus()?.also { + onEachSuccessfulPoll(it.progress) + } + }, ) private fun Store.updateProductReviewState( diff --git a/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckService.kt b/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckService.kt index 27c538d4967d..60ec062ab9b3 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckService.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckService.kt @@ -37,9 +37,9 @@ interface ReviewQualityCheckService { /** * Fetches the status of the product review for the current tab. * - * @return [AnalysisStatusDto] if the request succeeds, null otherwise. + * @return [AnalysisStatusProgressDto] if the request succeeds, null otherwise. */ - suspend fun analysisStatus(): AnalysisStatusDto? + suspend fun analysisStatus(): AnalysisStatusProgressDto? /** * Fetches product recommendations related to the product user is browsing in the current tab. @@ -49,14 +49,11 @@ interface ReviewQualityCheckService { suspend fun productRecommendation(shouldRecordAvailableTelemetry: Boolean): ProductRecommendation? /** - * Sends a click attribution event for a given product aid. - */ - suspend fun recordRecommendedProductClick(productAid: String) - - /** - * Sends an impression attribution event for a given product aid. + * Reports that a product is back in stock. + * + * @return [ReportBackInStockStatusDto] if the request succeeds, null otherwise. */ - suspend fun recordRecommendedProductImpression(productAid: String) + suspend fun reportBackInStock(): ReportBackInStockStatusDto? } /** @@ -68,6 +65,7 @@ class DefaultReviewQualityCheckService( private val browserStore: BrowserStore, ) : ReviewQualityCheckService { + private val recommendationsCache: MutableMap = mutableMapOf() private val logger = Logger("DefaultReviewQualityCheckService") override suspend fun fetchProductReview(): ProductAnalysis? = withContext(Dispatchers.Main) { @@ -104,13 +102,18 @@ class DefaultReviewQualityCheckService( } } - override suspend fun analysisStatus(): AnalysisStatusDto? = withContext(Dispatchers.Main) { + override suspend fun analysisStatus(): AnalysisStatusProgressDto? = withContext(Dispatchers.Main) { suspendCoroutine { continuation -> browserStore.state.selectedTab?.let { tab -> tab.engineState.engineSession?.requestAnalysisStatus( url = tab.content.url, onResult = { - continuation.resume(it.asEnumOrDefault(AnalysisStatusDto.OTHER)) + continuation.resume( + AnalysisStatusProgressDto( + status = it.status.asEnumOrDefault(AnalysisStatusDto.OTHER)!!, + progress = it.progress, + ), + ) }, onException = { logger.error("Error fetching analysis status", it) @@ -125,56 +128,49 @@ class DefaultReviewQualityCheckService( withContext(Dispatchers.Main) { suspendCoroutine { continuation -> browserStore.state.selectedTab?.let { tab -> - tab.engineState.engineSession?.requestProductRecommendations( - url = tab.content.url, - onResult = { - if (it.isEmpty()) { - if (shouldRecordAvailableTelemetry) { - Shopping.surfaceNoAdsAvailable.record() + + if (recommendationsCache.containsKey(tab.content.url)) { + continuation.resume(recommendationsCache[tab.content.url]) + } else { + tab.engineState.engineSession?.requestProductRecommendations( + url = tab.content.url, + onResult = { + if (it.isEmpty()) { + if (shouldRecordAvailableTelemetry) { + Shopping.surfaceNoAdsAvailable.record() + } + } else { + Shopping.adsExposure.record() } - } else { - Shopping.adsExposure.record() - } - // Return the first available recommendation since ui requires only - // one recommendation. - continuation.resume(it.firstOrNull()) - }, - onException = { - logger.error("Error fetching product recommendation", it) - continuation.resume(null) - }, - ) + // Return the first available recommendation since ui requires only + // one recommendation. + continuation.resume( + it.firstOrNull()?.also { recommendation -> + recommendationsCache[tab.content.url] = recommendation + }, + ) + }, + onException = { + logger.error("Error fetching product recommendation", it) + continuation.resume(null) + }, + ) + } } } } - override suspend fun recordRecommendedProductClick(productAid: String) = - withContext(Dispatchers.Main) { - suspendCoroutine { continuation -> - browserStore.state.selectedTab?.engineState?.engineSession?.sendClickAttributionEvent( - aid = productAid, - onResult = { - continuation.resume(Unit) - }, - onException = { - logger.error("Error sending click attribution event", it) - continuation.resume(Unit) - }, - ) - } - } - - override suspend fun recordRecommendedProductImpression(productAid: String) { - withContext(Dispatchers.Main) { - suspendCoroutine { continuation -> - browserStore.state.selectedTab?.engineState?.engineSession?.sendImpressionAttributionEvent( - aid = productAid, + override suspend fun reportBackInStock(): ReportBackInStockStatusDto? = withContext(Dispatchers.Main) { + suspendCoroutine { continuation -> + browserStore.state.selectedTab?.let { tab -> + tab.engineState.engineSession?.reportBackInStock( + url = tab.content.url, onResult = { - continuation.resume(Unit) + continuation.resume(it.asEnumOrDefault()) }, onException = { - logger.error("Error sending impression attribution event", it) - continuation.resume(Unit) + logger.error("Error reporting product back in stock", it) + continuation.resume(null) }, ) } @@ -206,3 +202,34 @@ enum class AnalysisStatusDto { */ OTHER, } + +/** + * Class that represents the analysis status response of the product review analysis. + * + * @property status Enum indicating the current status of the analysis + * @property progress Number indicating the progress of the analysis + */ +data class AnalysisStatusProgressDto( + val status: AnalysisStatusDto, + val progress: Double, +) + +/** + * Enum that represents the status returned from reporting a product is back in stock. + */ +enum class ReportBackInStockStatusDto { + /** + * Report created. + */ + REPORT_CREATED, + + /** + * Product is already reported to be back in stock. + */ + ALREADY_REPORTED, + + /** + * Product was not actually marked as deleted. + */ + NOT_DELETED, +} diff --git a/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckTelemetryMiddleware.kt b/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckTelemetryMiddleware.kt index 3289f087b68e..e32ee49bc915 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckTelemetryMiddleware.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckTelemetryMiddleware.kt @@ -4,13 +4,17 @@ package org.mozilla.fenix.shopping.middleware +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import mozilla.components.browser.state.selector.selectedTab +import mozilla.components.browser.state.store.BrowserStore import mozilla.components.lib.state.MiddlewareContext import mozilla.components.lib.state.Store import org.mozilla.fenix.GleanMetrics.Shopping import org.mozilla.fenix.GleanMetrics.ShoppingSettings +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.shopping.store.ReviewQualityCheckAction import org.mozilla.fenix.shopping.store.ReviewQualityCheckMiddleware -import org.mozilla.fenix.shopping.store.ReviewQualityCheckState import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent.AnalysisStatus private const val ACTION_ENABLED = "enabled" @@ -18,8 +22,18 @@ private const val ACTION_DISABLED = "disabled" /** * Middleware that captures telemetry events for the review quality check feature. + * + * @param telemetryService The service that handles telemetry events for review checker. + * @param browserStore The [BrowserStore] instance to access the current tab. + * @param appStore The [AppStore] instance to access [ShoppingState]. + * @param scope The [CoroutineScope] to use for launching coroutines. */ -class ReviewQualityCheckTelemetryMiddleware : ReviewQualityCheckMiddleware { +class ReviewQualityCheckTelemetryMiddleware( + private val telemetryService: ReviewQualityCheckTelemetryService, + private val browserStore: BrowserStore, + private val appStore: AppStore, + private val scope: CoroutineScope, +) : ReviewQualityCheckMiddleware { override fun invoke( context: MiddlewareContext, @@ -129,11 +143,34 @@ class ReviewQualityCheckTelemetryMiddleware : ReviewQualityCheckMiddleware { } is ReviewQualityCheckAction.RecommendedProductImpression -> { - Shopping.surfaceAdsImpression.record() + browserStore.state.selectedTab?.let { tabSessionState -> + val key = ShoppingState.ProductRecommendationImpressionKey( + tabId = tabSessionState.id, + productUrl = tabSessionState.content.url, + aid = action.productAid, + ) + + val recordedImpressions = + appStore.state.shoppingState.recordedProductRecommendationImpressions + + if (!recordedImpressions.contains(key)) { + Shopping.surfaceAdsImpression.record() + scope.launch { + val result = + telemetryService.recordRecommendedProductImpression(action.productAid) + if (result != null) { + appStore.dispatch(ShoppingAction.ProductRecommendationImpression(key)) + } + } + } + } } is ReviewQualityCheckAction.RecommendedProductClick -> { Shopping.surfaceAdsClicked.record() + scope.launch { + telemetryService.recordRecommendedProductClick(action.productAid) + } } ReviewQualityCheckAction.ToggleProductRecommendation -> { @@ -159,5 +196,5 @@ class ReviewQualityCheckTelemetryMiddleware : ReviewQualityCheckMiddleware { private fun ReviewQualityCheckState.isStaleAnalysis(): Boolean = this is ReviewQualityCheckState.OptedIn && this.productReviewState is ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent && - this.productReviewState.analysisStatus == AnalysisStatus.NEEDS_ANALYSIS -} \ No newline at end of file + this.productReviewState.analysisStatus == AnalysisStatus.NeedsAnalysis +} diff --git a/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckTelemetryService.kt b/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckTelemetryService.kt new file mode 100644 index 000000000000..1c94452b355a --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckTelemetryService.kt @@ -0,0 +1,77 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.shopping.middleware + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import mozilla.components.browser.state.selector.selectedTab +import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.support.base.log.logger.Logger +import kotlin.coroutines.resume +import kotlin.coroutines.suspendCoroutine + +/** + * Service that handles telemetry events for review checker. + */ +interface ReviewQualityCheckTelemetryService { + + /** + * Sends a click attribution event for a given product aid. + */ + suspend fun recordRecommendedProductClick(productAid: String): Unit? + + /** + * Sends an impression attribution event for a given product aid. + */ + suspend fun recordRecommendedProductImpression(productAid: String): Unit? +} + +/** + * Service that handles the network requests for the review quality check feature. + * + * @param browserStore Reference to the application's [BrowserStore] to access state. + */ +class DefaultReviewQualityCheckTelemetryService( + private val browserStore: BrowserStore, +) : ReviewQualityCheckTelemetryService { + + private val logger = Logger(TAG) + + override suspend fun recordRecommendedProductClick(productAid: String) = + withContext(Dispatchers.Main) { + suspendCoroutine { continuation -> + browserStore.state.selectedTab?.engineState?.engineSession?.sendClickAttributionEvent( + aid = productAid, + onResult = { + continuation.resume(Unit) + }, + onException = { + logger.error("Error sending click attribution event", it) + continuation.resume(null) + }, + ) + } + } + + override suspend fun recordRecommendedProductImpression(productAid: String) = + withContext(Dispatchers.Main) { + suspendCoroutine { continuation -> + browserStore.state.selectedTab?.engineState?.engineSession?.sendImpressionAttributionEvent( + aid = productAid, + onResult = { + continuation.resume(Unit) + }, + onException = { + logger.error("Error sending impression attribution event", it) + continuation.resume(null) + }, + ) + } + } + + companion object { + private const val TAG = "ReviewQualityCheckTelemetryService" + } +} diff --git a/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckVendorsService.kt b/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckVendorsService.kt index e33697f54b07..e513db9e382e 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckVendorsService.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckVendorsService.kt @@ -14,6 +14,8 @@ import java.net.URISyntaxException private const val AMAZON_COM = "amazon.com" private const val BEST_BUY_COM = "bestbuy.com" private const val WALMART_COM = "walmart.com" +private const val AMAZON_DE = "amazon.de" +private const val AMAZON_FR = "amazon.fr" private val defaultVendorsList = enumValues().toList() /** @@ -57,6 +59,7 @@ class DefaultReviewQualityCheckVendorsService( host.contains(AMAZON_COM) -> createProductVendorsList(ProductVendor.AMAZON) host.contains(BEST_BUY_COM) -> createProductVendorsList(ProductVendor.BEST_BUY) host.contains(WALMART_COM) -> createProductVendorsList(ProductVendor.WALMART) + host.contains(AMAZON_DE) || host.contains(AMAZON_FR) -> listOf(ProductVendor.AMAZON) else -> defaultVendorsList } } diff --git a/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckAction.kt b/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckAction.kt index f40285df3f06..3abfc4561c80 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckAction.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckAction.kt @@ -56,7 +56,7 @@ sealed interface ReviewQualityCheckAction : Action { /** * Triggered when the user has enabled or disabled product recommendations. */ - object ToggleProductRecommendation : PreferencesMiddlewareAction, UpdateAction, TelemetryAction + object ToggleProductRecommendation : PreferencesMiddlewareAction, UpdateAction, NetworkAction, TelemetryAction /** * Triggered as a result of a [OptIn] or [Init] whe user has opted in for shopping experience. @@ -131,6 +131,13 @@ sealed interface ReviewQualityCheckAction : Action { */ object AnalyzeProduct : NetworkAction, UpdateAction, TelemetryAction + /** + * Triggered when the analysis status is updated. + * + * @property progress The progress of the analysis ranging from 0.0-100.0. + */ + data class UpdateAnalysisProgress(val progress: Double) : UpdateAction + /** * Triggered when the user clicks on the recommended product. * @@ -140,7 +147,7 @@ sealed interface ReviewQualityCheckAction : Action { data class RecommendedProductClick( val productAid: String, val productUrl: String, - ) : NavigationMiddlewareAction, NetworkAction, TelemetryAction + ) : NavigationMiddlewareAction, TelemetryAction /** * Triggered when the user views the recommended product. @@ -149,7 +156,7 @@ sealed interface ReviewQualityCheckAction : Action { */ data class RecommendedProductImpression( val productAid: String, - ) : NetworkAction, TelemetryAction + ) : TelemetryAction /** * Triggered when the user clicks on learn more link on the explainer card. @@ -218,5 +225,5 @@ sealed interface ReviewQualityCheckAction : Action { /** * Triggered when the user reports a product is back in stock. */ - object ReportProductBackInStock : TelemetryAction + object ReportProductBackInStock : NetworkAction, UpdateAction, TelemetryAction } diff --git a/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckState.kt b/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckState.kt index ce9a390d4d3a..3eefbaff1e98 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckState.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckState.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.shopping.store import androidx.compose.runtime.Immutable import mozilla.components.lib.state.State +import java.text.NumberFormat private const val NUMBER_OF_HIGHLIGHTS_FOR_COMPACT_MODE = 2 @@ -89,14 +90,38 @@ sealed interface ReviewQualityCheckState : State { * Denotes a generic error has occurred. */ object GenericError : Error + + /** + * Denotes a product is not available. + */ + object ProductNotAvailable : Error + + /** + * Denotes current user reported a product is back in stock. + */ + object ThanksForReporting : Error + + /** + * Denotes another user has already reported the product is back in stock. + */ + object ProductAlreadyReported : Error } /** * Denotes no analysis is present for the product the user is browsing. + * + * @property progress The [Progress] of the analysis, ranges from 0-100. + * Default value is -1, which means analysis is not in progress. */ data class NoAnalysisPresent( - val isReanalyzing: Boolean = false, - ) : ProductReviewState + val progress: Progress = Progress(-1f), + ) : ProductReviewState { + + /** + * Whether or not the progress bar is visible. + */ + val isProgressBarVisible: Boolean = progress.value != -1f + } /** * Denotes the state where analysis of the product is fetched and present. @@ -153,10 +178,48 @@ sealed interface ReviewQualityCheckState : State { } /** - * The status of the product analysis. + * The state of the product analysis. + */ + sealed interface AnalysisStatus { + /** + * Denotes reanalysis is in progress. + * + * @property progress The [Progress] of the analysis, ranges from 0-100. + */ + data class Reanalyzing(val progress: Progress) : AnalysisStatus + + /** + * Denotes a product needs analysis. + */ + object NeedsAnalysis : AnalysisStatus + + /** + * Denotes a product analysis is up to date. + */ + object UpToDate : AnalysisStatus + } + } + + /** + * Progress of the analysis, ranges from 0-100. + * + * @property value The value of the progress. + */ + data class Progress(val value: Float) { + /** + * Normalized progress, ranges from 0-1. */ - enum class AnalysisStatus { - NEEDS_ANALYSIS, REANALYZING, UP_TO_DATE + val normalizedProgress: Float = value / 100f + + /** + * Percentage formatted progress ranging from 0-100%. + */ + val formattedProgress: String = FORMATTER.format(normalizedProgress) + + companion object { + private val FORMATTER = NumberFormat.getPercentInstance().apply { + maximumFractionDigits = 0 + } } } } diff --git a/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStore.kt b/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStore.kt index e0c598b95934..ce760cc9412e 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStore.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStore.kt @@ -131,12 +131,20 @@ private fun mapStateForUpdateAction( when (it.productReviewState) { is ProductReviewState.AnalysisPresent -> { val productReviewState = - it.productReviewState.copy(analysisStatus = AnalysisStatus.REANALYZING) + it.productReviewState.copy( + analysisStatus = AnalysisStatus.Reanalyzing( + ProductReviewState.Progress(0f), + ), + ) it.copy(productReviewState = productReviewState) } is ProductReviewState.NoAnalysisPresent -> { - it.copy(productReviewState = it.productReviewState.copy(isReanalyzing = true)) + it.copy( + productReviewState = it.productReviewState.copy( + progress = ProductReviewState.Progress(0f), + ), + ) } else -> { @@ -161,5 +169,45 @@ private fun mapStateForUpdateAction( } } } + + is ReviewQualityCheckAction.UpdateAnalysisProgress -> { + state.mapIfOptedIn { + when (it.productReviewState) { + is ProductReviewState.NoAnalysisPresent -> { + it.copy( + productReviewState = it.productReviewState.copy( + progress = ProductReviewState.Progress(action.progress.toFloat()), + ), + ) + } + + is ProductReviewState.AnalysisPresent -> { + it.copy( + productReviewState = it.productReviewState.copy( + analysisStatus = AnalysisStatus.Reanalyzing( + ProductReviewState.Progress(action.progress.toFloat()), + ), + ), + ) + } + + else -> { + it + } + } + } + } + + ReviewQualityCheckAction.ReportProductBackInStock -> { + state.mapIfOptedIn { + if (it.productReviewState is ProductReviewState.Error.ProductNotAvailable) { + it.copy( + productReviewState = ProductReviewState.Error.ThanksForReporting, + ) + } else { + it + } + } + } } } diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/NoAnalysis.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/NoAnalysis.kt index c0a3821adba9..80a0bc002ac5 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/NoAnalysis.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/NoAnalysis.kt @@ -29,16 +29,20 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import org.mozilla.fenix.R import org.mozilla.fenix.compose.annotation.LightDarkPreview import org.mozilla.fenix.shopping.store.ReviewQualityCheckState +import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.NoAnalysisPresent +import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.Progress import org.mozilla.fenix.theme.FirefoxTheme /** * No analysis UI for review quality check content. * - * @param isAnalyzing Whether or not the displayed product is being analyzed. + * @param noAnalysisPresent The state of the analysis progress. * @param productRecommendationsEnabled The current state of the product recommendations toggle. * @param productVendor The vendor of the product. * @param isSettingsExpanded Whether or not the settings card is expanded. @@ -56,7 +60,7 @@ import org.mozilla.fenix.theme.FirefoxTheme @Suppress("LongParameterList") @Composable fun NoAnalysis( - isAnalyzing: Boolean, + noAnalysisPresent: NoAnalysisPresent, productRecommendationsEnabled: Boolean?, productVendor: ReviewQualityCheckState.ProductVendor, isSettingsExpanded: Boolean, @@ -74,7 +78,7 @@ fun NoAnalysis( modifier = modifier, verticalArrangement = Arrangement.spacedBy(16.dp), ) { - ReviewQualityNoAnalysisCard(isAnalyzing, onAnalyzeClick) + ReviewQualityNoAnalysisCard(noAnalysisPresent, onAnalyzeClick) ReviewQualityInfoCard( productVendor = productVendor, @@ -100,7 +104,7 @@ fun NoAnalysis( @Composable private fun ReviewQualityNoAnalysisCard( - isAnalyzing: Boolean, + noAnalysisPresent: NoAnalysisPresent, onAnalyzeClick: () -> Unit, ) { ReviewQualityCheckCard( @@ -117,18 +121,22 @@ private fun ReviewQualityNoAnalysisCard( Spacer(Modifier.height(8.dp)) - if (isAnalyzing) { + if (noAnalysisPresent.isProgressBarVisible) { Row( verticalAlignment = Alignment.CenterVertically, ) { - IndeterminateProgressIndicator( - Modifier.size(24.dp), + DeterminateProgressIndicator( + progress = noAnalysisPresent.progress.normalizedProgress, + modifier = Modifier.size(24.dp), ) Spacer(modifier = Modifier.width(8.dp)) Text( - text = stringResource(id = R.string.review_quality_check_analysis_in_progress_warning_title), + text = stringResource( + id = R.string.review_quality_check_analysis_in_progress_warning_title_2, + noAnalysisPresent.progress.formattedProgress, + ), style = FirefoxTheme.typography.headline8, color = FirefoxTheme.colors.textPrimary, modifier = Modifier.fillMaxWidth(), @@ -181,9 +189,21 @@ private fun ReviewQualityNoAnalysisCard( } } +private class NoAnalysisPreviewModelParameterProvider : + PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + NoAnalysisPresent(), + NoAnalysisPresent(Progress(50f)), + NoAnalysisPresent(Progress(100f)), + ) +} + @Composable @LightDarkPreview -private fun NoAnalysisPreview() { +private fun NoAnalysisPreview( + @PreviewParameter(NoAnalysisPreviewModelParameterProvider::class) noAnalysisPresent: NoAnalysisPresent, +) { FirefoxTheme { Box( modifier = Modifier @@ -197,7 +217,7 @@ private fun NoAnalysisPreview() { var isInfoExpanded by remember { mutableStateOf(false) } NoAnalysis( - isAnalyzing = isAnalyzing, + noAnalysisPresent = noAnalysisPresent, onAnalyzeClick = { isAnalyzing = !isAnalyzing }, productVendor = ReviewQualityCheckState.ProductVendor.AMAZON, productRecommendationsEnabled = productRecommendationsEnabled, diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysis.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysis.kt index 9c8af4d47129..f8739f7bd6f5 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysis.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysis.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.shopping.ui import androidx.compose.animation.Crossfade import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.spring +import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -21,6 +22,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Icon import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -34,6 +36,12 @@ import androidx.compose.ui.graphics.Brush import androidx.compose.ui.layout.layout import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.CollectionInfo +import androidx.compose.ui.semantics.CollectionItemInfo +import androidx.compose.ui.semantics.collectionInfo +import androidx.compose.ui.semantics.collectionItemInfo +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.heading import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.PreviewParameter @@ -51,6 +59,7 @@ import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductR import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent.AnalysisStatus import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent.HighlightsInfo import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.RecommendedProductState +import org.mozilla.fenix.shopping.ui.ext.headingResource import org.mozilla.fenix.theme.FirefoxTheme private val combinedParentHorizontalPadding = 32.dp @@ -106,16 +115,16 @@ fun ProductAnalysis( modifier = modifier, verticalArrangement = Arrangement.spacedBy(16.dp), ) { - when (productAnalysis.analysisStatus) { - AnalysisStatus.NEEDS_ANALYSIS -> { + when (val analysisStatus = productAnalysis.analysisStatus) { + is AnalysisStatus.NeedsAnalysis -> { ReanalyzeCard(onReanalyzeClick = onReanalyzeClick) } - AnalysisStatus.REANALYZING -> { - ReanalysisInProgressCard() + is AnalysisStatus.Reanalyzing -> { + ReanalysisInProgress(analysisStatus) } - AnalysisStatus.UP_TO_DATE -> { + is AnalysisStatus.UpToDate -> { // no-op } } @@ -190,12 +199,27 @@ private fun ReanalyzeCard( } @Composable -private fun ReanalysisInProgressCard() { - ReviewQualityCheckInfoCard( - title = stringResource(R.string.review_quality_check_reanalysis_in_progress_warning_title), - type = ReviewQualityCheckInfoType.Loading, - modifier = Modifier.fillMaxWidth(), - ) +private fun ReanalysisInProgress(reanalyzing: AnalysisStatus.Reanalyzing) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + modifier = Modifier.padding(vertical = 8.dp), + ) { + DeterminateProgressIndicator( + progress = reanalyzing.progress.normalizedProgress, + modifier = Modifier.size(24.dp), + ) + + Text( + text = stringResource( + id = R.string.review_quality_check_analysis_in_progress_warning_title_2, + reanalyzing.progress.formattedProgress, + ), + style = FirefoxTheme.typography.subtitle1, + color = FirefoxTheme.colors.textPrimary, + modifier = Modifier.fillMaxWidth(), + ) + } } @Composable @@ -203,7 +227,7 @@ private fun ReviewGradeCard( reviewGrade: ReviewQualityCheckState.Grade, modifier: Modifier = Modifier, ) { - ReviewQualityCheckCard(modifier = modifier.semantics(mergeDescendants = true) {}) { + ReviewQualityCheckCard(modifier = modifier.semantics(mergeDescendants = true) { heading() }) { Text( text = stringResource(R.string.review_quality_check_grade_title), color = FirefoxTheme.colors.textPrimary, @@ -222,7 +246,7 @@ private fun AdjustedProductRatingCard( rating: Float, modifier: Modifier = Modifier, ) { - ReviewQualityCheckCard(modifier = modifier.semantics(mergeDescendants = true) {}) { + ReviewQualityCheckCard(modifier = modifier.semantics(mergeDescendants = true) { heading() }) { FlowRow( horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth(), @@ -244,7 +268,7 @@ private fun AdjustedProductRatingCard( } Text( - text = stringResource(R.string.review_quality_check_adjusted_rating_description), + text = stringResource(R.string.review_quality_check_adjusted_rating_description_2), color = FirefoxTheme.colors.textPrimary, style = FirefoxTheme.typography.caption, ) @@ -267,11 +291,17 @@ private fun HighlightsCard( highlightsInfo.highlightsForCompactMode } } + val titleContentDescription = + headingResource(id = R.string.review_quality_check_highlights_title) Text( text = stringResource(R.string.review_quality_check_highlights_title), color = FirefoxTheme.colors.textPrimary, style = FirefoxTheme.typography.headline8, + modifier = Modifier.semantics { + heading() + contentDescription = titleContentDescription + }, ) Spacer(modifier = Modifier.height(16.dp)) @@ -285,19 +315,52 @@ private fun HighlightsCard( .fillMaxWidth() .animateContentSize(animationSpec = spring()), ) { - highlightsToDisplay.forEach { highlight -> - HighlightTitle(highlight.key) + highlightsToDisplay.onEachIndexed { indexHighlightTitle, highlight -> + Box( + modifier = Modifier.semantics { + collectionInfo = CollectionInfo(rowCount = highlightsToDisplay.size, columnCount = 1) + }, + ) { + HighlightTitle( + highlightType = highlight.key, + modifier = Modifier.semantics { + collectionItemInfo = CollectionItemInfo( + rowIndex = indexHighlightTitle, + rowSpan = 1, + columnIndex = 1, + columnSpan = 1, + ) + }, + ) + } Spacer(modifier = Modifier.height(8.dp)) - highlight.value.forEach { - HighlightText(it) - - Spacer(modifier = Modifier.height(4.dp)) - } - - if (highlightsToDisplay.entries.last().key != highlight.key) { - Spacer(modifier = Modifier.height(16.dp)) + Column( + modifier = Modifier.semantics { + collectionInfo = + CollectionInfo(rowCount = highlight.value.size, columnCount = 1) + }, + ) { + highlight.value.onEachIndexed { index, text -> + HighlightText( + text = text, + modifier = Modifier.semantics { + collectionItemInfo = CollectionItemInfo( + rowIndex = index, + rowSpan = 1, + columnIndex = 1, + columnSpan = 1, + ) + }, + ) + + Spacer(modifier = Modifier.height(4.dp)) + } + + if (highlightsToDisplay.entries.last().key != highlight.key) { + Spacer(modifier = Modifier.height(16.dp)) + } } } } @@ -344,14 +407,18 @@ private fun HighlightsCard( } @Composable -private fun HighlightText(text: String) { +private fun HighlightText( + text: String, + modifier: Modifier = Modifier, +) { Row( verticalAlignment = Alignment.CenterVertically, + modifier = modifier, ) { Spacer(modifier = Modifier.width(32.dp)) Text( - text = text, + text = stringResource(id = R.string.surrounded_with_quotes, text), color = FirefoxTheme.colors.textPrimary, style = FirefoxTheme.typography.body2, ) @@ -359,9 +426,13 @@ private fun HighlightText(text: String) { } @Composable -private fun HighlightTitle(highlightType: HighlightType) { +private fun HighlightTitle( + highlightType: HighlightType, + modifier: Modifier = Modifier, +) { Row( verticalAlignment = Alignment.CenterVertically, + modifier = modifier, ) { val highlight = remember(highlightType) { highlightType.toHighlight() } @@ -381,16 +452,17 @@ private fun HighlightTitle(highlightType: HighlightType) { } } -private fun Modifier.extendWidthToParentBorder(): Modifier = this.layout { measurable, constraints -> - val placeable = measurable.measure( - constraints.copy( - maxWidth = constraints.maxWidth + combinedParentHorizontalPadding.roundToPx(), - ), - ) - layout(placeable.width, placeable.height) { - placeable.place(0, 0) +private fun Modifier.extendWidthToParentBorder(): Modifier = + this.layout { measurable, constraints -> + val placeable = measurable.measure( + constraints.copy( + maxWidth = constraints.maxWidth + combinedParentHorizontalPadding.roundToPx(), + ), + ) + layout(placeable.width, placeable.height) { + placeable.place(0, 0) + } } -} private fun HighlightType.toHighlight() = when (this) { @@ -437,6 +509,7 @@ private fun ProductRecommendation( ReviewQualityCheckCard( modifier = Modifier .fillMaxWidth() + .semantics { heading() } .clickable { onClick(product.aid, product.productUrl) } @@ -458,6 +531,8 @@ private fun ProductRecommendation( url = product.imageUrl, modifier = Modifier.size(productRecommendationImageSize), targetSize = productRecommendationImageSize, + placeholder = { ImagePlaceholder() }, + fallback = { ImagePlaceholder() }, ) Text( @@ -497,6 +572,25 @@ private fun ProductRecommendation( } } +@Composable +private fun ImagePlaceholder() { + Box( + modifier = Modifier + .size(productRecommendationImageSize) + .background( + color = FirefoxTheme.colors.layer3, + shape = RoundedCornerShape(8.dp), + ), + ) { + Image( + painter = painterResource(id = R.drawable.ic_file_type_image), + contentDescription = null, + modifier = Modifier + .align(Alignment.Center), + ) + } +} + private class ProductAnalysisPreviewModel( val productRecommendationsEnabled: Boolean?, val productAnalysis: AnalysisPresent, @@ -506,7 +600,7 @@ private class ProductAnalysisPreviewModel( productRecommendationsEnabled: Boolean? = false, productId: String = "123", reviewGrade: ReviewQualityCheckState.Grade? = ReviewQualityCheckState.Grade.B, - analysisStatus: AnalysisStatus = AnalysisStatus.UP_TO_DATE, + analysisStatus: AnalysisStatus = AnalysisStatus.UpToDate, adjustedRating: Float? = 3.6f, productUrl: String = "", highlightsInfo: HighlightsInfo = HighlightsInfo( @@ -561,10 +655,17 @@ private class ProductAnalysisPreviewModelParameterProvider : get() = sequenceOf( ProductAnalysisPreviewModel(), ProductAnalysisPreviewModel( - analysisStatus = AnalysisStatus.NEEDS_ANALYSIS, + analysisStatus = AnalysisStatus.NeedsAnalysis, ), ProductAnalysisPreviewModel( - analysisStatus = AnalysisStatus.REANALYZING, + analysisStatus = AnalysisStatus.Reanalyzing( + ReviewQualityCheckState.OptedIn.ProductReviewState.Progress(40f), + ), + ), + ProductAnalysisPreviewModel( + analysisStatus = AnalysisStatus.Reanalyzing( + ReviewQualityCheckState.OptedIn.ProductReviewState.Progress(95f), + ), ), ProductAnalysisPreviewModel( reviewGrade = null, diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysisError.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysisError.kt index 83e950c3e0fc..1a4ca2815bec 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysisError.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysisError.kt @@ -29,6 +29,7 @@ import org.mozilla.fenix.theme.FirefoxTheme * Product analysis error UI * * @param error The error state to display. + * @param onReportBackInStockClick Invoked when the user clicks on the report back in stock button. * @param productRecommendationsEnabled The current state of the product recommendations toggle. * @param productVendor The vendor of the product. * @param isSettingsExpanded Whether or not the settings card is expanded. @@ -43,9 +44,10 @@ import org.mozilla.fenix.theme.FirefoxTheme * @param modifier Modifier to apply to the layout. */ @Composable -@Suppress("LongParameterList") +@Suppress("LongParameterList", "LongMethod") fun ProductAnalysisError( error: ProductReviewState.Error, + onReportBackInStockClick: () -> Unit, productRecommendationsEnabled: Boolean?, productVendor: ReviewQualityCheckState.ProductVendor, isSettingsExpanded: Boolean, @@ -98,14 +100,51 @@ fun ProductAnalysisError( ReviewQualityCheckInfoType.Info, ) } + + ProductReviewState.Error.ProductNotAvailable -> { + Triple( + R.string.review_quality_check_product_availability_warning_title, + R.string.review_quality_check_product_availability_warning_body, + ReviewQualityCheckInfoType.Info, + ) + } + + ProductReviewState.Error.ProductAlreadyReported -> { + Triple( + R.string.review_quality_check_analysis_requested_other_user_info_title, + R.string.review_quality_check_analysis_requested_other_user_info_body, + ReviewQualityCheckInfoType.Info, + ) + } + + ProductReviewState.Error.ThanksForReporting -> { + Triple( + R.string.review_quality_check_analysis_requested_info_title, + R.string.review_quality_check_analysis_requested_info_body, + ReviewQualityCheckInfoType.Info, + ) + } } - ReviewQualityCheckInfoCard( - title = stringResource(id = titleResourceId), - description = stringResource(id = descriptionResourceId), - type = type, - modifier = Modifier.fillMaxWidth(), - ) + if (error == ProductReviewState.Error.ProductNotAvailable) { + ReviewQualityCheckInfoCard( + title = stringResource(id = titleResourceId), + description = stringResource(id = descriptionResourceId), + type = type, + modifier = Modifier.fillMaxWidth(), + buttonText = InfoCardButtonText( + text = stringResource(R.string.review_quality_check_product_availability_warning_action_2), + onClick = onReportBackInStockClick, + ), + ) + } else { + ReviewQualityCheckInfoCard( + title = stringResource(id = titleResourceId), + description = stringResource(id = descriptionResourceId), + type = type, + modifier = Modifier.fillMaxWidth(), + ) + } ReviewQualityInfoCard( productVendor = productVendor, @@ -145,6 +184,7 @@ private fun ProductAnalysisErrorPreview() { ProductAnalysisError( error = ProductReviewState.Error.NetworkError, + onReportBackInStockClick = { }, productRecommendationsEnabled = productRecommendationsEnabled, productVendor = ReviewQualityCheckState.ProductVendor.AMAZON, isSettingsExpanded = isSettingsExpanded, diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ProgressIndicator.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ProgressIndicator.kt index 3ab4beabb728..7bacb90d3163 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ProgressIndicator.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ProgressIndicator.kt @@ -4,14 +4,23 @@ package org.mozilla.fenix.shopping.ui +import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width +import androidx.compose.material.Button import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.StrokeCap @@ -19,38 +28,70 @@ import androidx.compose.ui.unit.dp import org.mozilla.fenix.compose.annotation.LightDarkPreview import org.mozilla.fenix.theme.FirefoxTheme +private val ProgressIndicatorWidth = 5.dp + /** - * UI displaying a circular progress indicator continuously loading. + * UI displaying a circular progress indicator with a determinate value. * + * @param progress The progress value to display. * @param modifier [Modifier] to be applied to the indicator. */ @Composable -fun IndeterminateProgressIndicator( +fun DeterminateProgressIndicator( + progress: Float, modifier: Modifier = Modifier, ) { + val floatState = animateFloatAsState( + progress, + label = "DeterminateProgressIndicator", + ) + CircularProgressIndicator( modifier = modifier, - color = FirefoxTheme.colors.actionPrimary, - strokeWidth = 2.dp, - strokeCap = StrokeCap.Round, + progress = floatState.value, + color = FirefoxTheme.colors.layerAccent, + backgroundColor = FirefoxTheme.colors.actionTertiary, + strokeWidth = ProgressIndicatorWidth, + strokeCap = StrokeCap.Butt, ) } @LightDarkPreview @Composable -private fun ProgressIndicatorPreview() { +private fun DeterminateProgressIndicatorPreviewDark() { FirefoxTheme { Column( modifier = Modifier .background(FirefoxTheme.colors.layer1) - .width(50.dp) - .height(50.dp), + .padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.SpaceEvenly, + verticalArrangement = Arrangement.spacedBy(16.dp), ) { - IndeterminateProgressIndicator( - modifier = Modifier.size(25.dp), + var progress: Float by remember { mutableFloatStateOf(0f) } + + DeterminateProgressIndicator( + progress = progress, + modifier = Modifier.size(48.dp), ) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Button( + onClick = { progress += 0.1f }, + modifier = Modifier.height(56.dp), + ) { + Text(text = "Increase progress") + } + + Button( + onClick = { progress -= 0.1f }, + modifier = Modifier.height(56.dp), + ) { + Text(text = "Decrease progress") + } + } } } } diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckBottomSheet.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckBottomSheet.kt index 07608506e5ba..81d375239a8b 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckBottomSheet.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckBottomSheet.kt @@ -81,6 +81,9 @@ fun ReviewQualityCheckBottomSheet( onReanalyzeClick = { store.dispatch(ReviewQualityCheckAction.ReanalyzeProduct) }, + onReportBackInStockClick = { + store.dispatch(ReviewQualityCheckAction.ReportProductBackInStock) + }, onProductRecommendationsEnabledStateChange = { store.dispatch(ReviewQualityCheckAction.ToggleProductRecommendation) }, @@ -141,6 +144,7 @@ private fun ProductReview( onFooterLinkClick: () -> Unit, onRecommendedProductClick: (aid: String, url: String) -> Unit, onProductRecommendationImpression: (aid: String) -> Unit, + onReportBackInStockClick: () -> Unit, ) { when (val productReviewState = state.productReviewState) { is AnalysisPresent -> { @@ -167,6 +171,7 @@ private fun ProductReview( is ReviewQualityCheckState.OptedIn.ProductReviewState.Error -> { ProductAnalysisError( error = productReviewState, + onReportBackInStockClick = onReportBackInStockClick, productRecommendationsEnabled = state.productRecommendationsPreference, productVendor = state.productVendor, isSettingsExpanded = state.isSettingsExpanded, @@ -191,7 +196,7 @@ private fun ProductReview( } NoAnalysis( - isAnalyzing = productReviewState.isReanalyzing, + noAnalysisPresent = productReviewState, onAnalyzeClick = onAnalyzeClick, productRecommendationsEnabled = state.productRecommendationsPreference, productVendor = state.productVendor, diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckCards.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckCards.kt index 7925d96c602b..4617a877ca7c 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckCards.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckCards.kt @@ -30,10 +30,14 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.heading +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import org.mozilla.fenix.R import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.shopping.ui.ext.headingResource import org.mozilla.fenix.theme.FirefoxTheme private val cardShape = RoundedCornerShape(8.dp) @@ -61,10 +65,13 @@ fun ReviewQualityCheckExpandableCard( modifier = modifier, contentPadding = PaddingValues(0.dp), ) { + val titleContentDescription = headingResource(title) + Row( horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier .fillMaxWidth() + .semantics { heading() } .clickable( onClickLabel = if (isExpanded) { stringResource(R.string.a11y_action_label_collapse) @@ -80,6 +87,9 @@ fun ReviewQualityCheckExpandableCard( text = title, color = FirefoxTheme.colors.textPrimary, style = FirefoxTheme.typography.headline8, + modifier = Modifier.semantics { + contentDescription = titleContentDescription + }, ) val chevronDrawable = if (isExpanded) { diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckContextualOnboarding.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckContextualOnboarding.kt index 43cdf5f4f271..6d15e9ea2cb6 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckContextualOnboarding.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckContextualOnboarding.kt @@ -16,6 +16,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.heading +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight @@ -29,9 +32,10 @@ import org.mozilla.fenix.compose.button.PrimaryButton import org.mozilla.fenix.shopping.store.ReviewQualityCheckState import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.ProductVendor import org.mozilla.fenix.shopping.ui.ext.displayName +import org.mozilla.fenix.shopping.ui.ext.headingResource import org.mozilla.fenix.theme.FirefoxTheme -const val PLACEHOLDER_URL = "www.fakespot.com" +private const val MAX_SUPPORTED_VENDORS_PER_TLD = 3 /** * A placeholder UI for review quality check contextual onboarding. The actual UI will be @@ -60,12 +64,18 @@ fun ReviewQualityCheckContextualOnboarding( stringResource(id = R.string.review_quality_check_contextual_onboarding_privacy_policy_2) val termsOfUseText = stringResource(id = R.string.review_quality_check_contextual_onboarding_terms_use_2) + val titleContentDescription = + headingResource(R.string.review_quality_check_contextual_onboarding_title) ReviewQualityCheckCard(modifier = Modifier.fillMaxWidth()) { Text( text = stringResource(R.string.review_quality_check_contextual_onboarding_title), color = FirefoxTheme.colors.textPrimary, style = FirefoxTheme.typography.headline5, + modifier = Modifier.semantics { + heading() + contentDescription = titleContentDescription + }, ) Spacer(modifier = Modifier.height(16.dp)) @@ -87,7 +97,7 @@ fun ReviewQualityCheckContextualOnboarding( linkTextStates = listOf( LinkTextState( text = learnMoreText, - url = PLACEHOLDER_URL, + url = "", onClick = { onLearnMoreClick() }, @@ -117,7 +127,7 @@ fun ReviewQualityCheckContextualOnboarding( linkTextStates = listOf( LinkTextState( text = privacyPolicyText, - url = PLACEHOLDER_URL, + url = "", onClick = { onPrivacyPolicyClick() }, @@ -134,7 +144,7 @@ fun ReviewQualityCheckContextualOnboarding( linkTextStates = listOf( LinkTextState( text = termsOfUseText, - url = PLACEHOLDER_URL, + url = "", onClick = { onTermsOfUseClick() }, @@ -184,13 +194,22 @@ private fun createDescriptionString( ) = buildAnnotatedString { val retailerNames = retailers.map { it.displayName() } - val description = stringResource( - id = R.string.review_quality_check_contextual_onboarding_description, - retailerNames[0], - stringResource(R.string.app_name), - retailerNames[1], - retailerNames[2], - ) + val description = if (retailers.size == MAX_SUPPORTED_VENDORS_PER_TLD) { + stringResource( + id = R.string.review_quality_check_contextual_onboarding_description, + retailerNames[0], + stringResource(R.string.app_name), + retailerNames[1], + retailerNames[2], + ) + } else { + stringResource( + id = R.string.review_quality_check_contextual_onboarding_description_one_vendor, + retailerNames.first(), + stringResource(R.string.app_name), + ) + } + append(description) retailerNames.forEach { retailer -> diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckInfoCard.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckInfoCard.kt index 3e65253a79c4..1b307fb96173 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckInfoCard.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckInfoCard.kt @@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.material.Icon import androidx.compose.material.Text @@ -22,6 +21,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.heading +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider @@ -31,6 +33,7 @@ import org.mozilla.fenix.compose.LinkText import org.mozilla.fenix.compose.LinkTextState import org.mozilla.fenix.compose.annotation.LightDarkPreview import org.mozilla.fenix.compose.button.PrimaryButton +import org.mozilla.fenix.shopping.ui.ext.headingResource import org.mozilla.fenix.theme.FirefoxTheme /** @@ -61,6 +64,8 @@ fun ReviewQualityCheckInfoCard( ), elevation = 0.dp, ) { + val titleContentDescription = headingResource(title) + Row { when (type) { ReviewQualityCheckInfoType.Warning -> { @@ -77,10 +82,6 @@ fun ReviewQualityCheckInfoCard( -> { InfoCardIcon(iconId = R.drawable.mozac_ic_information_fill_24) } - - ReviewQualityCheckInfoType.Loading -> { - IndeterminateProgressIndicator(modifier = Modifier.size(24.dp)) - } } Spacer(modifier = Modifier.width(12.dp)) @@ -90,6 +91,10 @@ fun ReviewQualityCheckInfoCard( text = title, color = FirefoxTheme.colors.textPrimary, style = FirefoxTheme.typography.headline8, + modifier = Modifier.semantics { + heading() + contentDescription = titleContentDescription + }, ) description?.let { @@ -154,7 +159,6 @@ enum class ReviewQualityCheckInfoType { Error, Info, AnalysisUpdate, - Loading, ; val cardBackgroundColor: Color @@ -165,7 +169,6 @@ enum class ReviewQualityCheckInfoType { Error -> FirefoxTheme.colors.layerError Info -> FirefoxTheme.colors.layerInfo AnalysisUpdate -> Color.Transparent - Loading -> Color.Transparent } val buttonBackgroundColor: Color @@ -176,14 +179,13 @@ enum class ReviewQualityCheckInfoType { Error -> FirefoxTheme.colors.actionError Info -> FirefoxTheme.colors.actionInfo AnalysisUpdate -> FirefoxTheme.colors.actionSecondary - Loading -> FirefoxTheme.colors.actionSecondary } val buttonTextColor: Color @Composable get() = when { this == Info && !isSystemInDarkTheme() -> FirefoxTheme.colors.textOnColorPrimary - this == AnalysisUpdate || this == Loading -> FirefoxTheme.colors.textActionSecondary + this == AnalysisUpdate -> FirefoxTheme.colors.textActionSecondary else -> FirefoxTheme.colors.textPrimary } } diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckScaffold.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckScaffold.kt index bafd7e009741..6efff6f95ae8 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckScaffold.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckScaffold.kt @@ -23,12 +23,17 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.clearAndSetSemantics +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.heading import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.traversalIndex import androidx.compose.ui.unit.dp import org.mozilla.fenix.R import org.mozilla.fenix.compose.BetaLabel import org.mozilla.fenix.compose.BottomSheetHandle import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.shopping.ui.ext.headingResource import org.mozilla.fenix.theme.FirefoxTheme private val bottomSheetShape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp) @@ -69,7 +74,8 @@ fun ReviewQualityCheckScaffold( contentDescription = stringResource(R.string.review_quality_check_close_handle_content_description), modifier = Modifier .fillMaxWidth(BOTTOM_SHEET_HANDLE_WIDTH_PERCENT) - .align(Alignment.CenterHorizontally), + .align(Alignment.CenterHorizontally) + .semantics { traversalIndex = -1f }, ) Spacer(modifier = Modifier.height(16.dp)) @@ -87,19 +93,27 @@ fun ReviewQualityCheckScaffold( @Composable private fun Header() { + val reviewCheckerFeatureName = stringResource(R.string.review_quality_check_feature_name_2) + val betaText = stringResource(R.string.review_quality_check_beta_flag) + val titleContentDescription = headingResource("$reviewCheckerFeatureName, $betaText") + Row( - modifier = Modifier.semantics(mergeDescendants = true) {}, + modifier = Modifier.semantics(mergeDescendants = true) { + heading() + contentDescription = titleContentDescription + }, verticalAlignment = Alignment.CenterVertically, ) { Text( - text = stringResource(R.string.review_quality_check_feature_name_2), + text = reviewCheckerFeatureName, color = FirefoxTheme.colors.textPrimary, style = FirefoxTheme.typography.headline6, + modifier = Modifier.clearAndSetSemantics {}, ) Spacer(modifier = Modifier.width(8.dp)) - BetaLabel() + BetaLabel(modifier = Modifier.clearAndSetSemantics {}) } } diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ext/HeadingResource.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ext/HeadingResource.kt new file mode 100644 index 000000000000..6687cac2b537 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ext/HeadingResource.kt @@ -0,0 +1,33 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.shopping.ui.ext + +import androidx.annotation.StringRes +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.ui.res.stringResource +import org.mozilla.fenix.R + +/** + * Returns a string resource with the heading a11y suffix. + * + * @param id The string resource id. + */ +@Composable +@ReadOnlyComposable +fun headingResource(@StringRes id: Int): String { + return headingResource(text = stringResource(id = id)) +} + +/** + * Returns a string with the heading a11y suffix. + * + * @param text The string. + */ +@Composable +@ReadOnlyComposable +fun headingResource(text: String): String { + return stringResource(id = R.string.a11y_heading, text) +} diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt index 1a657533f105..8c73da20bfd2 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt @@ -42,6 +42,7 @@ import org.mozilla.fenix.components.bookmarks.BookmarksUseCase import org.mozilla.fenix.ext.DEFAULT_ACTIVE_DAYS import org.mozilla.fenix.ext.potentialInactiveTabs import org.mozilla.fenix.home.HomeFragment +import org.mozilla.fenix.library.bookmarks.BookmarksSharedViewModel import org.mozilla.fenix.tabstray.browser.InactiveTabsController import org.mozilla.fenix.tabstray.browser.TabsTrayFabController import org.mozilla.fenix.tabstray.ext.getTabSessionState @@ -193,6 +194,7 @@ interface TabsTrayController : SyncedTabsController, InactiveTabsController, Tab * @param showBookmarkSnackbar Lambda used to display a snackbar upon saving tabs as bookmarks. * @param showCollectionSnackbar Lambda used to display a snackbar upon successfully saving tabs * to a collection. + * @param bookmarksSharedViewModel [BookmarksSharedViewModel] used to get currently selected bookmark root. */ @Suppress("TooManyFunctions", "LongParameterList") class DefaultTabsTrayController( @@ -219,6 +221,7 @@ class DefaultTabsTrayController( tabSize: Int, isNewCollection: Boolean, ) -> Unit, + private val bookmarksSharedViewModel: BookmarksSharedViewModel, ) : TabsTrayController { override fun handleNormalTabsFabClick() { @@ -405,7 +408,11 @@ class DefaultTabsTrayController( // if we leave the fragment, i.e. we still want the bookmarks to be added if the // tabs tray closes before the job is done. CoroutineScope(ioDispatcher).launch { - bookmarksUseCase.addBookmark(tab.content.url, tab.content.title) + bookmarksUseCase.addBookmark( + tab.content.url, + tab.content.title, + parentGuid = bookmarksSharedViewModel.selectedFolder?.guid, + ) } } diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt index 876f6b8501dc..6bc8082ab384 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt @@ -53,6 +53,7 @@ import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.runIfFragmentIsAttached import org.mozilla.fenix.ext.settings import org.mozilla.fenix.home.HomeScreenViewModel +import org.mozilla.fenix.library.bookmarks.BookmarksSharedViewModel import org.mozilla.fenix.share.ShareFragment import org.mozilla.fenix.tabstray.browser.SelectionBannerBinding import org.mozilla.fenix.tabstray.browser.SelectionBannerBinding.VisibilityModifier @@ -99,6 +100,7 @@ class TabsTrayFragment : AppCompatDialogFragment() { private val tabsFeature = ViewBoundFeatureWrapper() private val tabsTrayInactiveTabsOnboardingBinding = ViewBoundFeatureWrapper() private val syncedTabsIntegration = ViewBoundFeatureWrapper() + private val bookmarksSharedViewModel: BookmarksSharedViewModel by activityViewModels() @VisibleForTesting @Suppress("VariableNaming") @@ -188,6 +190,7 @@ class TabsTrayFragment : AppCompatDialogFragment() { showCancelledDownloadWarning = ::showCancelledDownloadWarning, showCollectionSnackbar = ::showCollectionSnackbar, showBookmarkSnackbar = ::showBookmarkSnackbar, + bookmarksSharedViewModel = bookmarksSharedViewModel, ) tabsTrayInteractor = DefaultTabsTrayInteractor( diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayTabLayouts.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayTabLayouts.kt index ef3bc167cec1..9d8e32404d43 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayTabLayouts.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayTabLayouts.kt @@ -8,8 +8,10 @@ import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridItemSpan @@ -42,6 +44,7 @@ import org.mozilla.fenix.tabstray.browser.compose.createListReorderState import org.mozilla.fenix.tabstray.browser.compose.detectGridPressAndDragGestures import org.mozilla.fenix.tabstray.browser.compose.detectVerticalPressAndDrag import org.mozilla.fenix.tabstray.ext.MIN_COLUMN_WIDTH_DP +import org.mozilla.fenix.tabstray.ext.numberOfGridColumns import org.mozilla.fenix.theme.FirefoxTheme import kotlin.math.max @@ -181,7 +184,7 @@ private fun TabGrid( } LazyVerticalGrid( - columns = GridCells.Adaptive(minSize = MIN_COLUMN_WIDTH_DP.dp), + columns = GridCells.Fixed(count = LocalContext.current.numberOfGridColumns), modifier = modifier .fillMaxSize() .detectGridPressAndDragGestures( @@ -360,6 +363,36 @@ private fun TabGridPreview() { modifier = Modifier .fillMaxSize() .background(FirefoxTheme.colors.layer1), + ) { + TabLayout( + tabs = tabs, + storage = ThumbnailStorage(LocalContext.current), + selectedTabId = tabs[0].id, + selectionMode = TabsTrayState.Mode.Normal, + displayTabsInGrid = false, + onTabClose = tabs::remove, + onTabMediaClick = {}, + onTabClick = {}, + onTabLongClick = {}, + onTabDragStart = {}, + onMove = { _, _, _ -> }, + ) + } + } +} + +@LightDarkPreview +@Composable +private fun TabGridSmallPreview() { + val tabs = remember { generateFakeTabsList().toMutableStateList() } + val width = MIN_COLUMN_WIDTH_DP.dp + 50.dp + + FirefoxTheme { + Box( + modifier = Modifier + .fillMaxHeight() + .width(width) + .background(FirefoxTheme.colors.layer1), ) { TabLayout( tabs = tabs, diff --git a/app/src/main/java/org/mozilla/fenix/translations/TranslationSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/translations/TranslationSettingsFragment.kt index 43088b5774fe..9308a0588b92 100644 --- a/app/src/main/java/org/mozilla/fenix/translations/TranslationSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/translations/TranslationSettingsFragment.kt @@ -34,9 +34,24 @@ class TranslationSettingsFragment : Fragment(), UserInteractionHandler { FirefoxTheme { TranslationSettings( translationSwitchList = getTranslationSettingsSwitchList(), - onAutomaticTranslationClicked = {}, - onDownloadLanguageClicked = {}, - onNeverTranslationClicked = {}, + onAutomaticTranslationClicked = { + findNavController().navigate( + TranslationSettingsFragmentDirections + .actionTranslationSettingsFragmentToAutomaticTranslationPreferenceFragment(), + ) + }, + onNeverTranslationClicked = { + findNavController().navigate( + TranslationSettingsFragmentDirections + .actionTranslationSettingsFragmentToNeverTranslateSitePreferenceFragment(), + ) + }, + onDownloadLanguageClicked = { + findNavController().navigate( + TranslationSettingsFragmentDirections + .actionTranslationSettingsFragmentToDownloadLanguagesPreferenceFragment(), + ) + }, ) } } diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationItemPreference.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationItemPreference.kt new file mode 100644 index 000000000000..30bfed028e4e --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationItemPreference.kt @@ -0,0 +1,67 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.automatic + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize +import org.mozilla.fenix.R + +/** + * AutomaticTranslationItem that will appear on Automatic Translation screen. + * + * @property displayName The text that will appear in the list. + * @property automaticTranslationOptionPreference The option that the user selected. + */ +@Parcelize +data class AutomaticTranslationItemPreference( + val displayName: String, + val automaticTranslationOptionPreference: AutomaticTranslationOptionPreference, +) : Parcelable + +/** + * AutomaticTranslationOption for a language. + * + * @property titleId The string id title of the option. + * @property summaryId The string id summary of the option. + */ +@Parcelize +sealed class AutomaticTranslationOptionPreference( + open val titleId: Int, + open val summaryId: List, +) : Parcelable { + + /** + * The app will offer to translate sites in the selected language. + */ + data class OfferToTranslate( + override val titleId: Int = R.string.automatic_translation_option_offer_to_translate_title_preference, + override val summaryId: List = listOf( + R.string.automatic_translation_option_offer_to_translate_summary_preference, + R.string.firefox, + ), + ) : AutomaticTranslationOptionPreference(titleId = titleId, summaryId = summaryId) + + /** + * The app will translate in the selected language automatically when the page loads. + */ + data class AlwaysTranslate( + override val titleId: Int = R.string.automatic_translation_option_always_translate_title_preference, + override val summaryId: List = listOf( + R.string.automatic_translation_option_always_translate_summary_preference, + R.string.firefox, + ), + ) : AutomaticTranslationOptionPreference(titleId = titleId, summaryId = summaryId) + + /** + * The app will never offer to translate sites in the selected language. + */ + data class NeverTranslate( + override val titleId: Int = R.string.automatic_translation_option_never_translate_title_preference, + override val summaryId: List = listOf( + R.string.automatic_translation_option_never_translate_summary_preference, + R.string.firefox, + ), + ) : AutomaticTranslationOptionPreference(titleId = titleId, summaryId = summaryId) +} diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreference.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreference.kt new file mode 100644 index 000000000000..5dbb409d91ea --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreference.kt @@ -0,0 +1,67 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.automatic + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.compose.list.RadioButtonListItem +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * Firefox Automatic Translation Options preference screen. + * + * @param selectedOption Selected option that will come from the translations engine. + */ +@Composable +fun AutomaticTranslationOptionsPreference( + selectedOption: AutomaticTranslationOptionPreference, +) { + val optionsList = arrayListOf( + AutomaticTranslationOptionPreference.OfferToTranslate(), + AutomaticTranslationOptionPreference.AlwaysTranslate(), + AutomaticTranslationOptionPreference.NeverTranslate(), + ) + val selected = remember { mutableStateOf(selectedOption) } + Column( + modifier = Modifier + .background( + color = FirefoxTheme.colors.layer1, + ), + ) { + LazyColumn { + items(optionsList) { item: AutomaticTranslationOptionPreference -> + RadioButtonListItem( + label = stringResource(item.titleId), + selected = selected.value == item, + description = stringResource( + item.summaryId.first(), + stringResource(item.summaryId.last()), + ), + onClick = { + selected.value = item + }, + ) + } + } + } +} + +@Composable +@LightDarkPreview +private fun AutomaticTranslationOptionsPreview() { + FirefoxTheme { + AutomaticTranslationOptionsPreference( + selectedOption = AutomaticTranslationOptionPreference.AlwaysTranslate(), + ) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreferenceFragment.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreferenceFragment.kt new file mode 100644 index 000000000000..75dd43ca4238 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreferenceFragment.kt @@ -0,0 +1,41 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.automatic + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.navArgs +import org.mozilla.fenix.ext.showToolbar +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * A fragment displaying the Firefox Preference Automatic Translation Options screen. + */ +class AutomaticTranslationOptionsPreferenceFragment : Fragment() { + private val args by navArgs() + + override fun onResume() { + super.onResume() + showToolbar(args.selectedTranslationOptionPreference.displayName) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View = ComposeView(requireContext()).apply { + setContent { + FirefoxTheme { + AutomaticTranslationOptionsPreference( + selectedOption = args.selectedTranslationOptionPreference.automaticTranslationOptionPreference, + ) + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreference.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreference.kt new file mode 100644 index 000000000000..959d69adf467 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreference.kt @@ -0,0 +1,115 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.automatic + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.heading +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.compose.list.TextListItem +import org.mozilla.fenix.theme.FirefoxTheme +import java.util.Locale + +/** + * Firefox Preferences Automatic Translate preference screen. + * + * @param automaticTranslationListPreferences List of [AutomaticTranslationItemPreference]s to display. + * @param onItemClick Invoked when the user clicks on the a item from the list. + */ +@Composable +fun AutomaticTranslationPreference( + automaticTranslationListPreferences: List, + onItemClick: (AutomaticTranslationItemPreference) -> Unit, +) { + Column( + modifier = Modifier + .background( + color = FirefoxTheme.colors.layer1, + ), + ) { + TextListItem( + label = stringResource(R.string.automatic_translation_header_preference), + modifier = Modifier + .padding( + start = 56.dp, + ) + .semantics { heading() }, + maxLabelLines = Int.MAX_VALUE, + ) + + LazyColumn { + items(automaticTranslationListPreferences) { item: AutomaticTranslationItemPreference -> + var description: String? = null + if ( + item.automaticTranslationOptionPreference !is + AutomaticTranslationOptionPreference.OfferToTranslate + ) { + description = stringResource(item.automaticTranslationOptionPreference.titleId) + } + TextListItem( + label = item.displayName, + description = description, + modifier = Modifier + .fillMaxWidth() + .padding(start = 56.dp), + onClick = { + onItemClick(item) + }, + ) + } + } + } +} + +@Composable +internal fun getAutomaticTranslationListPreferences(): List { + return mutableListOf().apply { + add( + AutomaticTranslationItemPreference( + displayName = Locale.CANADA.displayName, + automaticTranslationOptionPreference = AutomaticTranslationOptionPreference.AlwaysTranslate(), + ), + ) + add( + AutomaticTranslationItemPreference( + displayName = Locale.FRANCE.displayName, + automaticTranslationOptionPreference = AutomaticTranslationOptionPreference.OfferToTranslate(), + ), + ) + add( + AutomaticTranslationItemPreference( + displayName = Locale.GERMANY.displayName, + automaticTranslationOptionPreference = AutomaticTranslationOptionPreference.NeverTranslate(), + ), + ) + add( + AutomaticTranslationItemPreference( + displayName = Locale.CHINA.displayName, + automaticTranslationOptionPreference = AutomaticTranslationOptionPreference.AlwaysTranslate(), + ), + ) + } +} + +@Composable +@LightDarkPreview +private fun AutomaticTranslationPreferencePreview() { + FirefoxTheme { + AutomaticTranslationPreference( + automaticTranslationListPreferences = getAutomaticTranslationListPreferences(), + onItemClick = {}, + ) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreferenceFragment.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreferenceFragment.kt new file mode 100644 index 000000000000..9830a1715647 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreferenceFragment.kt @@ -0,0 +1,48 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.automatic + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.showToolbar +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * A fragment displaying the Firefox Automatic Translation list screen. + */ +class AutomaticTranslationPreferenceFragment : Fragment() { + override fun onResume() { + super.onResume() + showToolbar(getString(R.string.automatic_translation_toolbar_title_preference)) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View = ComposeView(requireContext()).apply { + setContent { + FirefoxTheme { + AutomaticTranslationPreference( + automaticTranslationListPreferences = getAutomaticTranslationListPreferences(), + onItemClick = { + findNavController().navigate( + AutomaticTranslationPreferenceFragmentDirections + .actionAutomaticTranslationPreferenceToAutomaticTranslationOptionsPreference( + it, + ), + ) + }, + ) + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/downloadlanguages/DownloadLanguageItemPreference.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/downloadlanguages/DownloadLanguageItemPreference.kt new file mode 100644 index 000000000000..5965010bb3ed --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/downloadlanguages/DownloadLanguageItemPreference.kt @@ -0,0 +1,51 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.downloadlanguages + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize +import org.mozilla.geckoview.TranslationsController + +/** + * DownloadLanguageItemPreference that will appear on [DownloadLanguagesPreferenceFragment] screen. + * + * @property languageModel The object comes from the translation engine. + * @property state State of the [languageModel]. + */ +data class DownloadLanguageItemPreference( + val languageModel: TranslationsController.RuntimeTranslation.LanguageModel, + val state: DownloadLanguageItemStatePreference, +) + +/** + * DownloadLanguageItemStatePreference the state of the [DownloadLanguageItemPreference] + * + * @property type The type of the language item. + * @property status State of the language file. + */ +@Parcelize +data class DownloadLanguageItemStatePreference( + val type: DownloadLanguageItemTypePreference, + val status: DownloadLanguageItemStatusPreference, +) : Parcelable + +/** + * DownloadLanguageItemTypePreference the type of the [DownloadLanguageItemPreference] + */ +enum class DownloadLanguageItemTypePreference { + PivotLanguage, + AllLanguages, + GeneralLanguage, +} + +/** + * DownloadLanguageItemStatusPreference the status of the [DownloadLanguageItemPreference] + */ +enum class DownloadLanguageItemStatusPreference { + Downloaded, + NotDownloaded, + DownloadInProgress, + Selected, +} diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/downloadlanguages/DownloadLanguagesPreference.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/downloadlanguages/DownloadLanguagesPreference.kt new file mode 100644 index 000000000000..bc1e37dd60a8 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/downloadlanguages/DownloadLanguagesPreference.kt @@ -0,0 +1,506 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.downloadlanguages + +import androidx.compose.foundation.LocalIndication +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.semantics.clearAndSetSemantics +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.heading +import androidx.compose.ui.semantics.role +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.unit.dp +import mozilla.components.feature.downloads.toMegabyteOrKilobyteString +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.Divider +import org.mozilla.fenix.compose.LinkText +import org.mozilla.fenix.compose.LinkTextState +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme +import org.mozilla.fenix.translations.DownloadIconIndicator +import org.mozilla.geckoview.TranslationsController +import java.util.Locale + +/** + * Firefox Download Languages preference screen. + * + * @param downloadLanguageItemPreferences List of [DownloadLanguageItemPreference]s that needs to be displayed. + * @param onItemClick Invoked when the user clicks on the language item. + */ +@Suppress("LongMethod") +@Composable +fun DownloadLanguagesPreference( + downloadLanguageItemPreferences: List, + onItemClick: (DownloadLanguageItemPreference) -> Unit, +) { + val downloadedItems = downloadLanguageItemPreferences.filter { + it.state.status == DownloadLanguageItemStatusPreference.Downloaded && + it.state.type == DownloadLanguageItemTypePreference.GeneralLanguage + } + + val notDownloadedItems = downloadLanguageItemPreferences.filter { + it.state.status == DownloadLanguageItemStatusPreference.NotDownloaded && + it.state.type == DownloadLanguageItemTypePreference.GeneralLanguage + } + + val inProgressItems = downloadLanguageItemPreferences.filter { + it.state.status == DownloadLanguageItemStatusPreference.DownloadInProgress && + it.state.type == DownloadLanguageItemTypePreference.GeneralLanguage + } + + val allLanguagesItem = downloadLanguageItemPreferences.last { + it.state.type == DownloadLanguageItemTypePreference.AllLanguages + } + + val defaultLanguageItem = downloadLanguageItemPreferences.last { + it.state.type == DownloadLanguageItemTypePreference.PivotLanguage + } + + Column( + modifier = Modifier.background( + color = FirefoxTheme.colors.layer1, + ), + ) { + DownloadLanguagesHeaderPreference() + + LazyColumn { + item { + DownloadLanguagesHeader( + stringResource( + id = R.string.download_languages_available_languages_preference, + ), + ) + } + + item { + LanguageItemPreference( + item = defaultLanguageItem, + onItemClick = onItemClick, + ) + } + + items(downloadedItems) { item: DownloadLanguageItemPreference -> + LanguageItemPreference( + item = item, + onItemClick = onItemClick, + ) + } + + items(inProgressItems) { item: DownloadLanguageItemPreference -> + LanguageItemPreference( + item = item, + onItemClick = onItemClick, + ) + } + + item { + Divider(Modifier.padding(top = 8.dp, bottom = 8.dp)) + } + + item { + DownloadLanguagesHeader( + stringResource( + id = R.string.download_language_header_preference, + ), + ) + } + + item { + LanguageItemPreference( + item = allLanguagesItem, + onItemClick = onItemClick, + ) + Divider(Modifier.padding(top = 8.dp, bottom = 8.dp)) + } + + items(notDownloadedItems) { item: DownloadLanguageItemPreference -> + item.languageModel.language?.localizedDisplayName?.let { + LanguageItemPreference( + item = item, + onItemClick = onItemClick, + ) + } + } + } + } +} + +@Composable +private fun DownloadLanguagesHeader(title: String) { + Text( + text = title, + modifier = Modifier + .fillMaxWidth() + .padding(start = 72.dp, end = 16.dp, top = 8.dp) + .semantics { heading() }, + color = FirefoxTheme.colors.textAccent, + style = FirefoxTheme.typography.headline8, + ) +} + +@Composable +private fun LanguageItemPreference( + item: DownloadLanguageItemPreference, + onItemClick: (DownloadLanguageItemPreference) -> Unit, +) { + val description: String = + if (item.state.type == DownloadLanguageItemTypePreference.PivotLanguage) { + "(" + stringResource(id = R.string.download_languages_default_system_language_require_preference) + ")" + } else { + "(" + item.languageModel.size.toMegabyteOrKilobyteString() + ")" + } + + val contentDescription = + downloadLanguageItemContentDescriptionPreference(item = item, itemDescription = description) + + item.languageModel.language?.localizedDisplayName?.let { + TextListItemInlineDescription( + label = it, + modifier = Modifier + .padding( + start = 56.dp, + ) + .clearAndSetSemantics { + role = Role.Button + this.contentDescription = + contentDescription + }, + description = description, + enabled = item.state.status != DownloadLanguageItemStatusPreference.DownloadInProgress, + onClick = { onItemClick(item) }, + icon = { IconDownloadLanguageItemPreference(item = item) }, + ) + } +} + +@Composable +private fun DownloadLanguagesHeaderPreference() { + val learnMoreText = + stringResource(id = R.string.download_languages_header_learn_more_preference) + val learnMoreState = LinkTextState( + text = learnMoreText, + url = "www.mozilla.com", + onClick = {}, + ) + Box( + modifier = Modifier + .padding( + start = 72.dp, + top = 6.dp, + bottom = 6.dp, + end = 16.dp, + ) + .semantics { heading() }, + ) { + LinkText( + text = stringResource( + R.string.download_languages_header_preference, + learnMoreText, + ), + linkTextStates = listOf(learnMoreState), + style = FirefoxTheme.typography.subtitle1.copy( + color = FirefoxTheme.colors.textPrimary, + ), + linkTextDecoration = TextDecoration.Underline, + ) + } +} + +@Composable +private fun downloadLanguageItemContentDescriptionPreference( + item: DownloadLanguageItemPreference, + itemDescription: String, +): String { + val contentDescription: String + + when (item.state.status) { + DownloadLanguageItemStatusPreference.Downloaded -> { + contentDescription = + item.languageModel.language?.localizedDisplayName + " " + itemDescription + stringResource( + id = R.string.download_languages_item_content_description_downloaded_state, + ) + } + + DownloadLanguageItemStatusPreference.NotDownloaded -> { + contentDescription = + item.languageModel.language?.localizedDisplayName + " " + itemDescription + " " + stringResource( + id = R.string.download_languages_item_content_description_not_downloaded_state, + ) + } + + DownloadLanguageItemStatusPreference.DownloadInProgress -> { + contentDescription = + item.languageModel.language?.localizedDisplayName + " " + itemDescription + " " + stringResource( + id = R.string.download_languages_item_content_description_in_progress_state, + ) + } + + DownloadLanguageItemStatusPreference.Selected -> { + contentDescription = + item.languageModel.language?.localizedDisplayName + " " + itemDescription + stringResource( + id = R.string.download_languages_item_content_description_selected_state, + ) + } + } + return contentDescription +} + +@Composable +private fun IconDownloadLanguageItemPreference(item: DownloadLanguageItemPreference) { + when (item.state.status) { + DownloadLanguageItemStatusPreference.Downloaded -> { + if (item.state.type != DownloadLanguageItemTypePreference.PivotLanguage) { + Icon( + painter = painterResource( + id = R.drawable.ic_delete, + ), + contentDescription = null, + tint = FirefoxTheme.colors.iconPrimary, + ) + } + } + + DownloadLanguageItemStatusPreference.NotDownloaded -> { + if (item.state.type != DownloadLanguageItemTypePreference.PivotLanguage) { + Icon( + painter = painterResource( + id = R.drawable.ic_download, + ), + contentDescription = null, + tint = FirefoxTheme.colors.iconPrimary, + ) + } + } + + DownloadLanguageItemStatusPreference.DownloadInProgress -> { + if (item.state.type != DownloadLanguageItemTypePreference.PivotLanguage) { + DownloadIconIndicator( + icon = painterResource(id = R.drawable.mozac_ic_sync_24), + ) + } + } + + DownloadLanguageItemStatusPreference.Selected -> {} + } +} + +/** + * List item used to display a label with description text (right next to the label) and + * an [IconButton] at the end. + * + * @param label The label in the list item. + * @param modifier [Modifier] to be applied to the layout. + * @param description An description text right next the label. + * @param maxDescriptionLines An optional maximum number of lines for the description text to span. + * @param enabled Controls the enabled state. When false, onClick, + * and this modifier will appear disabled for accessibility services. + * @param onClick Called when the user clicks on the item. + * @param icon Composable for adding Icon UI. + */ +@Composable +private fun TextListItemInlineDescription( + label: String, + modifier: Modifier = Modifier, + description: String, + maxDescriptionLines: Int = 1, + enabled: Boolean = true, + onClick: (() -> Unit), + icon: @Composable RowScope.() -> Unit = {}, +) { + Row( + modifier = Modifier + .defaultMinSize(minHeight = 56.dp) + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = LocalIndication.current, + enabled = enabled, + ) { onClick.invoke() }, + verticalAlignment = Alignment.CenterVertically, + ) { + Row( + modifier = modifier + .padding(horizontal = 16.dp, vertical = 6.dp) + .weight(1f), + ) { + Text( + text = label, + color = FirefoxTheme.colors.textPrimary, + style = FirefoxTheme.typography.subtitle1, + maxLines = 1, + ) + + Text( + text = description, + modifier = Modifier.padding(horizontal = 5.dp), + color = FirefoxTheme.colors.textSecondary, + style = FirefoxTheme.typography.subtitle1, + maxLines = maxDescriptionLines, + ) + } + IconButton( + onClick = { onClick.invoke() }, + modifier = Modifier + .padding(end = 16.dp) + .size(24.dp) + .clearAndSetSemantics {}, + ) { + icon() + } + } +} + +@Suppress("MagicNumber", "LongMethod") +@Composable +internal fun getLanguageListPreference(): List { + return mutableListOf().apply { + add( + DownloadLanguageItemPreference( + languageModel = TranslationsController.RuntimeTranslation.LanguageModel( + TranslationsController.Language( + Locale.CHINA.toLanguageTag(), + Locale.CHINA.displayLanguage, + ), + false, + 4000, + ), + state = DownloadLanguageItemStatePreference( + type = DownloadLanguageItemTypePreference.GeneralLanguage, + status = DownloadLanguageItemStatusPreference.Downloaded, + ), + ), + ) + add( + DownloadLanguageItemPreference( + languageModel = TranslationsController.RuntimeTranslation.LanguageModel( + TranslationsController.Language( + Locale.KOREAN.toLanguageTag(), + Locale.KOREAN.displayLanguage, + ), + false, + 3000, + ), + state = DownloadLanguageItemStatePreference( + type = DownloadLanguageItemTypePreference.GeneralLanguage, + status = DownloadLanguageItemStatusPreference.NotDownloaded, + ), + ), + ) + + add( + DownloadLanguageItemPreference( + languageModel = TranslationsController.RuntimeTranslation.LanguageModel( + TranslationsController.Language( + Locale.FRANCE.toLanguageTag(), + Locale.FRANCE.displayLanguage, + ), + false, + 2000, + ), + state = DownloadLanguageItemStatePreference( + type = DownloadLanguageItemTypePreference.GeneralLanguage, + status = DownloadLanguageItemStatusPreference.NotDownloaded, + ), + ), + ) + add( + DownloadLanguageItemPreference( + languageModel = TranslationsController.RuntimeTranslation.LanguageModel( + TranslationsController.Language( + Locale.ITALIAN.toLanguageTag(), + Locale.ITALIAN.displayLanguage, + ), + false, + 1000, + ), + state = DownloadLanguageItemStatePreference( + type = DownloadLanguageItemTypePreference.GeneralLanguage, + status = DownloadLanguageItemStatusPreference.DownloadInProgress, + ), + ), + ) + add( + DownloadLanguageItemPreference( + languageModel = TranslationsController.RuntimeTranslation.LanguageModel( + TranslationsController.Language( + Locale.ENGLISH.toLanguageTag(), + Locale.ENGLISH.displayLanguage, + ), + true, + 3000, + ), + state = DownloadLanguageItemStatePreference( + type = DownloadLanguageItemTypePreference.PivotLanguage, + status = DownloadLanguageItemStatusPreference.Selected, + ), + ), + ) + add( + DownloadLanguageItemPreference( + languageModel = TranslationsController.RuntimeTranslation.LanguageModel( + TranslationsController.Language( + Locale.JAPANESE.toLanguageTag(), + Locale.JAPANESE.displayLanguage, + ), + true, + 3000, + ), + state = DownloadLanguageItemStatePreference( + type = DownloadLanguageItemTypePreference.GeneralLanguage, + status = DownloadLanguageItemStatusPreference.NotDownloaded, + ), + ), + ) + add( + DownloadLanguageItemPreference( + languageModel = TranslationsController.RuntimeTranslation.LanguageModel( + TranslationsController.Language( + stringResource(id = R.string.download_language_all_languages_item_preference), + stringResource(id = R.string.download_language_all_languages_item_preference), + ), + true, + 300000, + ), + state = DownloadLanguageItemStatePreference( + type = DownloadLanguageItemTypePreference.AllLanguages, + status = DownloadLanguageItemStatusPreference.NotDownloaded, + ), + ), + ) + } +} + +@Composable +@LightDarkPreview +private fun DownloadLanguagesPreferencePreview() { + FirefoxTheme { + DownloadLanguagesPreference( + downloadLanguageItemPreferences = getLanguageListPreference(), + onItemClick = {}, + ) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/downloadlanguages/DownloadLanguagesPreferenceFragment.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/downloadlanguages/DownloadLanguagesPreferenceFragment.kt new file mode 100644 index 000000000000..c3aa875bec24 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/downloadlanguages/DownloadLanguagesPreferenceFragment.kt @@ -0,0 +1,40 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.downloadlanguages + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.Fragment +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.showToolbar +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * A fragment displaying the Firefox Preferences Download Languages screen. + */ +class DownloadLanguagesPreferenceFragment : Fragment() { + override fun onResume() { + super.onResume() + showToolbar(getString(R.string.download_languages_toolbar_title_preference)) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View = ComposeView(requireContext()).apply { + setContent { + FirefoxTheme { + DownloadLanguagesPreference( + downloadLanguageItemPreferences = getLanguageListPreference(), + onItemClick = {}, + ) + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteDialogPreference.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteDialogPreference.kt new file mode 100644 index 000000000000..15421798623b --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteDialogPreference.kt @@ -0,0 +1,72 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.nevertranslatesite + +import androidx.compose.foundation.background +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.AlertDialog +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.compose.button.TextButton +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * Firefox Preference: Never Translate Dialog compose view. + * + * @param websiteUrl Title of the dialog that should be display. + * @param onConfirmDelete Invoked when the user clicks on the "Delete" dialog button. + * @param onCancel Invoked when the user clicks on the "Cancel" dialog button. + */ +@Composable +fun NeverTranslateSiteDialogPreference( + websiteUrl: String, + onConfirmDelete: () -> Unit, + onCancel: () -> Unit, +) { + AlertDialog( + onDismissRequest = {}, + modifier = Modifier.background( + color = FirefoxTheme.colors.layer2, + shape = RoundedCornerShape(8.dp), + ), + title = { + Text( + text = stringResource(R.string.never_translate_site_dialog_title_preference, websiteUrl), + color = FirefoxTheme.colors.textPrimary, + style = FirefoxTheme.typography.headline7, + ) + }, + confirmButton = { + TextButton( + text = stringResource(id = R.string.never_translate_site_dialog_confirm_delete_preference), + onClick = { onConfirmDelete() }, + ) + }, + dismissButton = { + TextButton( + text = stringResource(id = R.string.never_translate_site_dialog_cancel_preference), + onClick = { onCancel() }, + ) + }, + backgroundColor = FirefoxTheme.colors.layer2, + ) +} + +@Composable +@LightDarkPreview +private fun NeverTranslateSiteDialogPreferencePreview() { + FirefoxTheme { + NeverTranslateSiteDialogPreference( + websiteUrl = "wikipedia.com", + onConfirmDelete = {}, + onCancel = {}, + ) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteDialogPreferenceFragment.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteDialogPreferenceFragment.kt new file mode 100644 index 000000000000..41bcb4fb50ae --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteDialogPreferenceFragment.kt @@ -0,0 +1,47 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.nevertranslatesite + +import android.app.Dialog +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.DialogFragment +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * A dialog fragment displaying the Firefox Preference: never translate site item. + */ +class NeverTranslateSiteDialogPreferenceFragment : DialogFragment() { + + private val args by navArgs() + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = + super.onCreateDialog(savedInstanceState).apply { + setOnShowListener { + setCanceledOnTouchOutside(false) + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View = ComposeView(requireContext()).apply { + setContent { + FirefoxTheme { + NeverTranslateSiteDialogPreference( + websiteUrl = args.websiteUrl, + onConfirmDelete = { findNavController().popBackStack() }, + onCancel = { findNavController().popBackStack() }, + ) + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteListItemPreference.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteListItemPreference.kt new file mode 100644 index 000000000000..6baf2868ef90 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteListItemPreference.kt @@ -0,0 +1,12 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.nevertranslatesite + +/** + * NeverTranslateSiteListItemPreference that will appear on [NeverTranslateSitePreferenceFragment] screens. + * + * @property websiteUrl The text that will appear on the item list. + */ +data class NeverTranslateSiteListItemPreference(val websiteUrl: String) diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitePreference.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitePreference.kt new file mode 100644 index 000000000000..f806c445b922 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitePreference.kt @@ -0,0 +1,104 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.nevertranslatesite + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.semantics.clearAndSetSemantics +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.heading +import androidx.compose.ui.semantics.role +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.compose.list.TextListItem +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * Firefox Preference: Never Translate Site preference screen. + * + * @param neverTranslateSiteListPreferences List of [NeverTranslateSiteListItemPreference]s to display. + * @param onItemClick Invoked when the user clicks on the a item from the list. + */ +@Composable +fun NeverTranslateSitePreference( + neverTranslateSiteListPreferences: List, + onItemClick: (NeverTranslateSiteListItemPreference) -> Unit, +) { + Column( + modifier = Modifier + .background( + color = FirefoxTheme.colors.layer1, + ), + ) { + TextListItem( + label = stringResource(R.string.never_translate_site_header_preference), + modifier = Modifier + .padding( + start = 56.dp, + ) + .semantics { heading() }, + maxLabelLines = Int.MAX_VALUE, + ) + + LazyColumn { + items(neverTranslateSiteListPreferences) { item: NeverTranslateSiteListItemPreference -> + val itemContentDescription = stringResource( + id = R.string.never_translate_site_item_list_content_description_preference, + item.websiteUrl, + ) + TextListItem( + label = item.websiteUrl, + modifier = Modifier + .padding( + start = 56.dp, + ) + .clearAndSetSemantics { + role = Role.Button + contentDescription = itemContentDescription + }, + onClick = { onItemClick(item) }, + iconPainter = painterResource(R.drawable.mozac_ic_delete_24), + onIconClick = { onItemClick(item) }, + ) + } + } + } +} + +@Composable +internal fun getNeverTranslateListItemsPreference(): List { + return mutableListOf().apply { + add( + NeverTranslateSiteListItemPreference( + websiteUrl = "expedia.ca", + ), + ) + add( + NeverTranslateSiteListItemPreference( + websiteUrl = "wikipedia.com", + ), + ) + } +} + +@Composable +@LightDarkPreview +private fun NeverTranslateSitePreferencePreview() { + FirefoxTheme { + NeverTranslateSitePreference( + neverTranslateSiteListPreferences = getNeverTranslateListItemsPreference(), + ) {} + } +} diff --git a/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitePreferenceFragment.kt b/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitePreferenceFragment.kt new file mode 100644 index 000000000000..cfbde9661865 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitePreferenceFragment.kt @@ -0,0 +1,48 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.nevertranslatesite + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.showToolbar +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * A fragment displaying the Firefox Preference never translate site items list. + */ +class NeverTranslateSitePreferenceFragment : Fragment() { + override fun onResume() { + super.onResume() + showToolbar(getString(R.string.never_translate_site_toolbar_title_preference)) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View = ComposeView(requireContext()).apply { + setContent { + FirefoxTheme { + NeverTranslateSitePreference( + neverTranslateSiteListPreferences = getNeverTranslateListItemsPreference(), + onItemClick = { + findNavController().navigate( + NeverTranslateSitePreferenceFragmentDirections + .actionNeverTranslateSitePreferenceFragmentToNeverTranslateSiteDialogPreferenceFragment( + it.websiteUrl, + ), + ) + }, + ) + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 67da5d04ea1e..252d4de24e43 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -616,6 +616,11 @@ class Settings(private val appContext: Context) : PreferencesHolder { default = true, ) + var shouldEnableGlobalPrivacyControl by booleanPreference( + appContext.getPreferenceKey(R.string.pref_key_privacy_enable_global_privacy_control), + false, + ) + var shouldUseCookieBannerPrivateMode by lazyFeatureFlagPreference( appContext.getPreferenceKey(R.string.pref_key_cookie_banner_private_mode), featureFlag = true, @@ -1712,13 +1717,13 @@ class Settings(private val appContext: Context) : PreferencesHolder { ) /** - * Returns whether juno onboarding should be shown to the user. + * Returns whether onboarding should be shown to the user. * * @param hasUserBeenOnboarded Boolean to indicate whether the user has been onboarded. * @param isLauncherIntent Boolean to indicate whether the app was launched on tapping on the * app icon. */ - fun shouldShowJunoOnboarding(hasUserBeenOnboarded: Boolean, isLauncherIntent: Boolean): Boolean { + fun shouldShowOnboarding(hasUserBeenOnboarded: Boolean, isLauncherIntent: Boolean): Boolean { return if (!hasUserBeenOnboarded && isLauncherIntent) { FxNimbus.features.junoOnboarding.recordExposure() true @@ -1727,11 +1732,14 @@ class Settings(private val appContext: Context) : PreferencesHolder { } } - val feltPrivateBrowsingEnabled: Boolean - get() { + val feltPrivateBrowsingEnabled by lazyFeatureFlagPreference( + key = appContext.getPreferenceKey(R.string.pref_key_should_enable_felt_privacy), + featureFlag = true, + default = { FxNimbus.features.privateBrowsing.recordExposure() - return FxNimbus.features.privateBrowsing.value().feltPrivacyEnabled - } + FxNimbus.features.privateBrowsing.value().feltPrivacyEnabled + }, + ) /** * Indicates if the review quality check feature is enabled by the user. @@ -1891,6 +1899,14 @@ class Settings(private val appContext: Context) : PreferencesHolder { default = false, ) + /** + * Font List Telemetry Ping Sent + */ + var numFontListSent by intPreference( + key = appContext.getPreferenceKey(R.string.pref_key_num_font_list_sent), + default = 0, + ) + /** * Indicates how many days in the first week user opened the app. */ @@ -1980,4 +1996,24 @@ class Settings(private val appContext: Context) : PreferencesHolder { appContext.getPreferenceKey(R.string.pref_key_success_download_dialog), default = true, ) + + /** + * Indicates if the user is shown new redesigned Toolbar UI. + */ + var enableRedesignToolbar by lazyFeatureFlagPreference( + key = appContext.getPreferenceKey(R.string.pref_key_toolbar_use_redesign), + default = { FeatureFlags.completeToolbarRedesignEnabled }, + featureFlag = FeatureFlags.completeToolbarRedesignEnabled, + ) + + /** + * Indicates if the user is shown incomplete new redesigned Toolbar UI components and behaviors. + * + * DEV ONLY + */ + var enableIncompleteToolbarRedesign by lazyFeatureFlagPreference( + key = appContext.getPreferenceKey(R.string.pref_key_toolbar_use_redesign_incomplete), + default = { false }, + featureFlag = FeatureFlags.incompleteToolbarRedesignEnabled, + ) } diff --git a/app/src/main/res/drawable/ic_debug_transparent_fire_24.xml b/app/src/main/res/drawable/ic_debug_transparent_fire_24.xml new file mode 100644 index 000000000000..a76c51753084 --- /dev/null +++ b/app/src/main/res/drawable/ic_debug_transparent_fire_24.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 94dcd5aba3e4..fe8e4018f13a 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -18,12 +18,24 @@ android:layout_width="match_parent" android:layout_height="56dp" /> - - + android:layout_height="match_parent"> + + + + + + + diff --git a/app/src/main/res/layout/fragment_installed_add_on_details.xml b/app/src/main/res/layout/fragment_installed_add_on_details.xml index b7b3b865c919..d8b1fcba29e1 100644 --- a/app/src/main/res/layout/fragment_installed_add_on_details.xml +++ b/app/src/main/res/layout/fragment_installed_add_on_details.xml @@ -99,6 +99,13 @@ android:layout_marginHorizontal="16dp" android:layout_below="@id/permissions" android:text="@string/mozac_feature_addons_remove" /> + + diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 736dc350c6e9..1a4c9ac614b2 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -34,8 +34,8 @@ app:popUpToInclusive="false" /> @@ -187,12 +187,12 @@ + android:id="@+id/onboardingFragment" + android:name="org.mozilla.fenix.onboarding.OnboardingFragment"> @@ -1443,6 +1443,47 @@ app:destination="@id/translationsDialogFragment" app:popUpTo="@id/translationSettingsFragment" app:popUpToInclusive="true" /> + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/raw/initial_experiments.json b/app/src/main/res/raw/initial_experiments.json index 0a83fb092f27..a28f39a8497e 100644 --- a/app/src/main/res/raw/initial_experiments.json +++ b/app/src/main/res/raw/initial_experiments.json @@ -67,7 +67,7 @@ "channel": "release", "userFacingName": "Splash screen Test", "userFacingDescription": "Testing a splasshcreen on app launch.", - "isEnrollmentPaused": false, + "isEnrollmentPaused": true, "isRollout": false, "bucketConfig": { "randomizationUnit": "nimbus_id", @@ -128,7 +128,7 @@ ], "targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('121.!') >= 0) && (region in ['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW'])))", "startDate": "2023-12-06", - "enrollmentEndDate": null, + "enrollmentEndDate": "2024-01-10", "endDate": null, "proposedDuration": 49, "proposedEnrollment": 21, diff --git a/app/src/main/res/values-am/strings.xml b/app/src/main/res/values-am/strings.xml index 0086b9f4c373..e942e188ca03 100644 --- a/app/src/main/res/values-am/strings.xml +++ b/app/src/main/res/values-am/strings.xml @@ -68,11 +68,6 @@ በዚህ መሳሪያ ላይ ምንም ዱካ አትተዉ - - ሁሉንም የግል መስኮቶችዎን ሲዘጉ %1$s ኩኪዎችዎን፣ ታሪክዎን እና የድረ-ገፅ ውሂብዎን ይሰርዛል። %2$s የዴስክቶፕ ድረ-ገፅ + + በመደበኛ ትር ውስጥ ይክፈቱ ወደ መነሻ ማያ ገጽ ጨምር @@ -210,6 +207,8 @@ ዳግም አስምር በገጽ ውስጥ ያግኙ + + ገጽ ተርጉም ወደ ስብስብ አስቀምጥ @@ -258,7 +257,7 @@ ቃኝ - የፍለጋ ፍርግም + የፍለጋ ፍርግም የፍለጋ ፍርግም ቅንብሮች @@ -321,14 +320,8 @@ አሁን አይሆንም - - ፋየርፎክስን ነባሪ አሳሽዎ ያድርጉ ደህንነትዎን መጠበቅ እንወዳለን - - ፋየርፎክስ ሰዎችን ከትርፍ በላይ ያስቀድማል እና ድረ-ገጽ ተሻጋሪ መከታተያዎችን በማገድ የእርስዎን ግላዊነት ይጠብቃል።\n\nበግላዊነት ማስታወቂያችን ውስጥ የበለጠ ይረዱ። የእኛ ለትርፍ-ባልተቋቋመ የሚደገፈው አሳሽ ኩባንያዎች እርስዎን በድር ላይ በድብቅ እንዳይከተሉዎ ያግዛል።\n\nበግላዊነት ማስታወቂያችን ላይ የበለጠ ይረዱ። አሁን አይሆንም - - ከስልክ ወደ ላፕቶፕ ይዝለሉ እና ይመለሱ በመሳሪያዎች መካከል ሲዘጉ እንደተመሰጠሩ ይቆዩ - - ካቆሙበት ለመቀጠል ከሌሎች መሳሪያዎችዎ ትሮችን እና የይለፍ ቃሎችን ይያዙ። በመለያ ሲገቡ እና ስያመሳስሉ የበለጠ ደህንነት ይኖርዎታል። Firefox የእርስዎን የይለፍ ቃላት፣ ዕልባቶች እና ሌሎችንም ያመሰጥራል። @@ -352,15 +341,9 @@ ይግቡ አሁን አይሆንም - - ማሳወቂያዎች በፋየርፎክስ የበለጠ እንዲሰሩ ያግዝዎታል ማሳወቂያዎች በFirefox ደህንነትዎ እንደተጠበቀ እንዲቆዩ ያግዝዎታል - - በመሳሪያዎች መካከል ትሮችን ይላኩ፣ ውርዶችን ያስተዳድሩ እና ከፋየርፎክስ የበለጠ ለመጠቀም ምክሮችን ያግኙ። በመሳሪያዎችዎ መካከል ደህንነቱ በተጠበቀ ሁኔታ ትሮችን ይላኩ እና በFirefox ውስጥ ሌሎች የግላዊነት ባህሪያትን ያግኙ። @@ -401,8 +384,6 @@ አንዱን ይምረጡ - የፍለጋ አቋራጮችን ያስተዳድሩ - አማራጭ የፍለጋ ፍርግሞችን ያቀናብሩ በፍለጋ ምናሌው ውስጥ የሚታዩ ፍርግሞችን ያርትዑ @@ -416,8 +397,6 @@ የፍለጋ ፍርግሞች ከፍለጋ ፍርግሞች የቀረቡ ጥቆማዎች - - የአድራሻ አሞሌ የአድራሻ አሞሌ ምርጫዎች @@ -452,15 +431,19 @@ - የኩኪ ሰሌዳ ቅነሳ + የኩኪ ሰሌዳ ቅነሳ + + የኩኪ ባነር ማገጃ + + በግል አሰሳ ውስጥ የኩኪ ባነር ማገጃ - የኩኪ ሰሌዳዎችን ይቀንሱ + የኩኪ ሰሌዳዎችን ይቀንሱ - ጠፍቷል + ጠፍቷል - በርቷል + በርቷል - %1$s በኩኪ ሰንደቆች ላይ የኩኪ ጥያቄዎችን በራስ-ሰር ውድቅ ለማድረግ ይሞክራል። + %1$s በኩኪ ሰንደቆች ላይ የኩኪ ጥያቄዎችን በራስ-ሰር ውድቅ ለማድረግ ይሞክራል። ለዚህ ድረ-ገፅ ጠፍቷል @@ -478,29 +461,42 @@ በአሁኑ ጊዜ የማይደገፍ ድረ-ገፅ - ለ%1$s የኩኪ ሰሌዳ ቅነሳ ይብራ? + ለ%1$s የኩኪ ሰሌዳ ቅነሳ ይብራ? + + ለ%1$s የኩኪ ባነር ማገጃ ይብራ? + + ለ%1$s የኩኪ ሰሌዳ ቅነሳ ይጥፋ? - ለ%1$s የኩኪ ሰሌዳ ቅነሳ ይጥፋ? + ለ%1$s የኩኪ ባነር ማገጃ ይጥፋ? %1$s በዚህ ጣቢያ ላይ የኩኪ ጥያቄዎችን በራስ ሰር ውድቅ ማድረግ አይችልም። ለወደፊቱ ይህንን ጣቢያ ለመደገፍ ጥያቄ መላክ ይችላሉ። - %1$s የዚህን ድረ-ገፅ ኩኪዎች ያፀዳ እና ገጹን ያድሳል። ሁሉንም ኩኪዎች ማጽዳት እርስዎን ሊያስወጣዎት ወይም የግዢ ጋሪዎችን ባዶ ሊያደርግ ይችላል። + %1$s የዚህን ድረ-ገፅ ኩኪዎች ያፀዳ እና ገጹን ያድሳል። ሁሉንም ኩኪዎች ማጽዳት እርስዎን ሊያስወጣዎት ወይም የግዢ ጋሪዎችን ባዶ ሊያደርግ ይችላል። + + አጥፋ እና %1$s ኩኪዎችን አጽድቶ ይህን ጣቢያ እንደገና ይጭናል። ይህ ሊያስወጣዎት ወይም የግዢ ጋሪዎችን ባዶ ሊያደርግ ይችላል። - %1$s በሚደገፉ ድረ-ገፆች ላይ ያሉ ሁሉንም የኩኪ ጥያቄዎችን በራስ ሰር ውድቅ ለማድረግ ይሞክራል። + %1$s በሚደገፉ ድረ-ገፆች ላይ ያሉ ሁሉንም የኩኪ ጥያቄዎችን በራስ ሰር ውድቅ ለማድረግ ይሞክራል። + + አብራ እና %1$s በዚህ ጣቢያ ላይ ያሉትን ሁሉንም የኩኪ ባነሮች በራስ ሰር እምቢ ለማለት ይሞክራል። - %1$s የኩኪ ሰንደቆችን ውድቅ እንዲያደርግ ይፈቀድለት? + %1$s የኩኪ ሰንደቆችን ውድቅ እንዲያደርግ ይፈቀድለት? - %1$s ብዙ የኩኪ ባነር ጥያቄዎችን በራስ ሰር ውድቅ ያደርጋል። + %1$s ብዙ የኩኪ ባነር ጥያቄዎችን በራስ ሰር ውድቅ ያደርጋል። - አሁን አይሆንም + አሁን አይሆንም - ያነሱ የኩኪ ጥያቄዎችን ያያሉ + ያነሱ የኩኪ ጥያቄዎችን ያያሉ - ፍቀድ + ፍቀድ + + + %1$s አሁን ለእርስዎ ኩኪዎችን አልተቀበለም + + ያነሱ ትኩረትን የሚከፋፍሉ፣ በዚህ ጣቢያ ላይ እርስዎን የሚከታተሉ ኩኪዎች ያነሱ ናቸው። ለበለጠ ደህንነት HTTPS ምስጠራ ፕሮቶኮልን በመጠቀም ከድረ-ገፆች ጋር በራስ-ሰር ለመገናኘት ይሞክራል። @@ -524,14 +520,10 @@ ሆኖም፣ አጥቂው ተሳታፊ ሊሆን ይችላል። ወደ ድረ-ገጹ ከቀጠሉ ምንም አይነት ጥንቃቄ የሚሻ መረጃ ማስገባት የለብዎትም። ከቀጠሉ HTTPS-ብቻ ሁነታ ለጊዜው ለድረ-ገጹ ይጠፋል። ተደራሽነት - - ብጁ የፋየርፎክስ መለያ አገልጋይ ብጁ የMozilla መለያ አገልጋይ ብጁ የማመሳሰል አገልጋይ - - የፋየርፎክስ መለያ/አመሳስል አገልጋይ ተቀይሯል። ለውጦችን ለማካተት መተግበሪያውን በማቆም ላይ… የMozilla መለያ/አመሳስል አገልጋይ ተቀይሯል። ለውጦችን ለመተግበር መተግበሪያውን በማቆም ላይ… @@ -549,8 +541,6 @@ ትሮችን፣ እልባቶችን፣ የይለፍ ቃላትን እና ሌሎችን ለማመሳሰል ይግቡ። - የፋየርፎክስ መለያ - የMozilla መለያ ማመሳሰልን ለመቀጠል እንደገና ይገናኙ @@ -562,8 +552,6 @@ የውሂብ መሰብሰብ በUSB የርቀት ማረም - - የፍለጋ ፍርግሞችን አሳይ የፍለጋ ጥቆማዎችን አሳይ @@ -611,6 +599,8 @@ ተጨማሪዎች + + ተጨማሪውን ከፋይል ጫን ማሳወቂያዎች @@ -693,12 +683,6 @@ ተጨማሪዎችን ያስሱ - - - ተጨማሪ አይደገፍም - - ተጨማሪ አስቀድሞ ተጭኗል - ተጨማሪዎች ለጊዜው ተሰናክለዋል @@ -1563,6 +1547,8 @@ ሁሉም ኩኪዎች (ድረ-ገፆች ባግባቡ እንዳይሰሩ ያደርጋል) ድረ-ገጽ ተሻጋሪ ኩኪዎችን ለይ + + ድር ጣቢያዎች ውሂብ እንዳያጋሩ እና እንዳይሸጡ ይንገሯቸው የመከታተያ ይዘት @@ -1891,28 +1877,18 @@ አዲስ የፍለጋ ፍርግም ያክሉ የፍለጋ ፍርግሞችን ያርትዑ - - ጨምር - - አስቀምጥ አርትዕ ሰርዝ - - ሌላ ስም - - ስም የፍለጋ ፍርግም ስም የፍለጋ ሕብረ-ቁምፊ URL - - ለፍለጋ የሚጠቀሙት ሕብረቁምፊ ለፍለጋ የሚጠቀሙት URL @@ -2136,8 +2112,6 @@ - የግምገማ አረጋጋጭ - የግምገማ አረጋጋጭ አስተማማኝ ግምገማዎች @@ -2150,7 +2124,9 @@ የተስተካከለ ደረጃ - የማይታመኑ ግምገማዎች ተወግደዋል + የማይታመኑ ግምገማዎች ተወግደዋል + + በአስተማማኝ ግምገማዎች ላይ የተመሠረተ ከቅርብ ግዜ ግምገማዎች ዋና ዋናዎቹ @@ -2161,14 +2137,10 @@ ፊደል ደረጃ ከሀ እስከ ረ እንመድባለን።]]> አስተማማኝ ግምገማዎች። ግምገማዎቹ ሐቀኛ፣ አድልዎ የለሽ ግምገማዎችን ትተው ከወጡ እውነተኛ ደንበኞች ሊሆኑ እንደሚችሉ እናምናለን። - - ግምገማዎቹ አስተማማኝ ናቸው ብለን እናምናለን። አስተማማኝ እና የማይታመኑ ግምገማዎች ድብልቅ እንዳለ እናምናለን። የማይታመኑ ግምገማዎች። ግምገማዎቹ የሐሰት ወይም አድሏዊ ከሆኑ ገምጋሚዎች ናቸው ብለን እናምናለን። - - ግምገማዎቹ የማይታመኑ ናቸው ብለን እናምናለን። የተስተካከለ ደረጃ አስተማማኝ ናቸው ብለን ባመንባቸው ግምገማዎች ላይ ብቻ የተመሰረተ ነው።]]> @@ -2176,14 +2148,14 @@ ስለ%s የበለጠ ይወቁ። - %s በሞዚላ እንዴት የግምገማ ጥራት እንደሚወስን + %s በሞዚላ እንዴት የግምገማ ጥራት እንደሚወስን + + %s የግምገማ ጥራትን እንዴት እንደሚወስን ቅንብሮች በግምገማ አረጋጋጭ ውስጥ ማስታወቂያዎችን አሳይ - ለሚመለከታቸው ምርቶች አልፎ አልፎ ማስታወቂያዎችን ያያሉ። ሁሉም ማስታወቂያዎች የግምገማ የጥራት መስፈርቶቻችንን ማሟላት አለባቸው። %s - ለሚመለከታቸው ምርቶች አልፎ አልፎ ማስታወቂያዎችን ያያሉ። ምርቶችን የምናስተዋውቀው በታማኝ ግምገማዎች ብቻ ነው። %s የበለጠ ለማወቅ @@ -2194,8 +2166,6 @@ ማስታወቂያ በ%s - የግምገማ አረጋጋጭ የተጎላበተው በ%s ነው። - የግምገማ አረጋጋጭ የተጎላበተው በ%s ነው %s በሞዚላ @@ -2208,24 +2178,24 @@ ይህ ምርት ተጨማሪ ግምገማዎች ሲኖረው ጥራታቸውን ማረጋገጥ እንችላለን። - ምርቱ አይገኝም + ምርቱ አይገኝም - ይህ ምርት ወደ ክምችት እንደተመለሰ ካዩ፣ ሪፖርት ያድርጉት እና ግምገማዎቹን ለማየት እንሰራለን። - - ይህ ምርት ወደ ክምችት መመለሱን ሪፖርት ያድርጉ + ይህ ምርት ወደ ክምችት እንደተመለሰ ካዩ፣ ሪፖርት ያድርጉት እና ግምገማዎቹን ለማየት እንሰራለን። - ምርት በክምችት መኖሩን አመልክት + ምርት በክምችት መኖሩን አመልክት - የግምገማ ጥራት በመፈተሽ ላይ + የግምገማ ጥራት በመፈተሽ ላይ - የግምገማ ጥራት በመፈተሽ ላይ + የግምገማ ጥራት በመፈተሽ ላይ + + የግምገማውን ጥራት በመፈተሽ ላይ (%s) ይህ ወደ 60 ሰከንድ ሊወስድ ይችላል። - ሪፖርት ስላደረጉ እናመሰግናለን! + ሪፖርት ስላደረጉ እናመሰግናለን! - በ24 ሰዓታት ውስጥ ስለዚህ ምርት ግምገማዎች መረጃ ሊኖረን ይገባል። እባክዎን ተመልሰው ያረጋግጡ። + በ24 ሰዓታት ውስጥ ስለዚህ ምርት ግምገማዎች መረጃ ሊኖረን ይገባል። እባክዎን ተመልሰው ያረጋግጡ። እነዚህን ግምገማዎች ማረጋገጥ አንችልም @@ -2254,14 +2224,26 @@ የግምገማውን ጥራት ያረጋግጡ የእኛን የታመነ የምርት ግምገማዎች መመሪያን ይሞክሩ + + ከመግዛትዎ በፊት በ%1$s ላይ የምርት ግምገማዎች ምን ያህል አስተማማኝ እንደሆኑ ይመልከቱ። የግምገማ አረጋጋጭ፣ ከ%2$s የመጣ የሙከራ ባህሪ፣ ልክ በአሳሹ ውስጥ ነው የተሰራው። በ%3$s እና %4$s ላይም ይሰራል። + + ከመግዛትዎ በፊት በ%1$s ላይ የምርት ግምገማዎች ምን ያህል አስተማማኝ እንደሆኑ ይመልከቱ። የ%2$s የሙከራ ባህሪ የግምገማ አረጋጋጭ በቀጥታ በአሳሹ ውስጥ ነው የተሰራው። + + በሞዚላ የ%1$s ኃይልን በመጠቀም አድሎአዊ እና ትክክለኛ ያልሆኑ ግምገማዎችን እናግዝዎታለን። ሲገዙ እርስዎን ለመጠበቅ የእኛ AI ሞዴል ሁልጊዜ እየተሻሻለ ነው። %2$s የበለጠ ለማወቅ “አዎ ይሞክሩት” ን በመምረጥ በ%1$s በMozillaው %2$s እና %3$s ተስማምተዋል። + + “አዎ ይሞከር”ን በመምረጥ ከ%1$s በሚከተለው ይስማማሉ፡ የግላዊነት ፖሊሲ + + የግላዊነት መምሪያ የአጠቃቀም መመሪያ + + የአጠቃቀም መመሪያ አዎ፣ ይሞክሩት @@ -2298,6 +2280,9 @@ ተወዳዳሪነት + + “%s” + ሰብስብ @@ -2313,4 +2298,206 @@ ጽሑፉን ያንብቡ የበለጠ ለማወቅ አገናኝ ይክፈቱ + + %s፣ ርዕስ + + + አገናኞች + + + የሚገኙ አገናኞች + + + + + + ይህን ገጽ መተርጎም? + + በ%1$s ውስጥ የግል ትርጉሞችን ይሞክሩ + + ለግላዊነትዎ፣ ትርጉሞች ከመሳሪያዎ አይወጡም። አዲስ ቋንቋዎች እና ማሻሻያዎች በቅርቡ ይመጣሉ! %1$s + + ተጨማሪ ይወቁ + + ተርጉም ከ + + ተርጉም ወደ + + አሁን አይሆንም + + ተከናውኗል + + ተርጉም + + + እንደገና ሞክር + + በመተርጎም ላይ + + በመተርጎም ሂደት ላይ + + + የመተርጎም ችግር ነበር። እባክዎ እንደገና ይሞክሩ። + + ቋንቋዎችን መጫን አልተቻለም። የበይነመረብ ግንኙነትዎን ይፈትሹ እና እንደገና ይሞክሩ። + + ይቅርታ፣ እስካሁን %1$sን አንደግፍም። + + ተጨማሪ ይወቁ + + + + የትርጉም አማራጮች + + ሁልጊዜ ለመተርጎም አቅርብ + + ሁልጊዜ %1$sን ተርጉም + + %1$sን በጭራሽ አትተርጉም + + ይህን ጣቢያ በጭራሽ አትተርጉም + + የትርጉም ቅንብሮች + + በ%1$s ውስጥ ስለ ትርጉሞች + + + + ትርጉሞች + + ሲቻል ለመተርጎም አቅርብ + + + ሁልጊዜ ቋንቋዎችን በውሂብ ቁጠባ ሁነታ አውርድ + + የትርጉም ምርጫዎች + + ራስ-ሰር ትርጉም + + እነዚህን ጣቢያዎች በጭራሽ አትተርጉም + + ቋንቋዎችን አውርድ + + + + ራስ-ሰር ትርጉም + + ”ሁልጊዜ መተርጎም“ እና ”ፍፁም አትተረጎም“ ምርጫዎችን ለማስተዳደር ቋንቋ ምረጥ። + + + + ለመተርጎም አቅርብ (ነባሪ) + + %1$s ጣቢያዎችን በዚህ ቋንቋ ለመተርጎም ያቀርባል። + + ሁልጊዜ ተርጉም + + %1$s ገጹ ሲጫን ይህን ቋንቋ በራስ-ሰር ይተረጉመዋል። + + በጭራሽ አትተረጎም + + %1$s በዚህ ቋንቋ ጣቢያዎችን ለመተርጎም በጭራሽ አይሰጥም። + + + + እነዚህን ጣቢያዎች በጭራሽ አትተርጉም + + አዲስ ጣቢያ ለመጨመር፡ ይጎብኙት እና ከትርጉም ሜኑ ውስጥ “ይህን ጣቢያ በጭራሽ አትተርጉም” የሚለውን ይምረጡ። + + %1$sን አስወግድ + + %1$s ይጥፋ? + + አጥፋ + + ሰርዝ + + + + ቋንቋዎችን አውርድ + + ለፈጣን ትርጉሞች እና ከመስመር ውጭ ለመተርጎም የተሟላ ቋንቋዎችን ያውርዱ። %1$s + + ተጨማሪ ይወቁ + + የሚገኙ ቋንቋዎች + + ያስፈልጋል + + %1$s (%2$s) + + ቋንቋዎችን አውርድ + + ሁሉም ቋንቋዎች + + አጥፋ + + በሂደት ላይ + + አውርድ + + ተመርጧል + + + %1$s (%2$s) ይሰረዝ? + + ይህን ቋንቋ ከሰረዙት፣ ሲተረጉሙ %1$s ከፊል ቋንቋዎችን ወደ መሸጎጫዎ ያወርዳል። + + ሁሉም ቋንቋዎች ይሰረዙ (%1$s)? + + ሁሉንም ቋንቋዎች ከሰረዙ፣ ሲተረጉሙ %1$s ከፊል ቋንቋዎችን ወደ መሸጎጫዎ ያወርዳል። + + ሰርዝ + + ተወው + + + በውሂብ ቆጣቢ ሁነታ (%1$s) ላይ እያለ ይውረድ? + + ትርጉሞችን የግል ለማድረግ ከፊል ቋንቋዎችን ወደ መሸጎጫዎ እናወርዳለን። + + ሁልጊዜ በውሂብ ቁጠባ ሁነታ አውርድ + + አውርድ + + ያውርዱ እና ይተርጉሙ + + ተወው + + + + የፍተሻ መሳሪያዎች + + የትር መሳሪያዎች + + የትር ብዛት + + ንቁ + + እንቅስቃሴ-አልባ + + የግል + + ጠቅላላ + + ትር መፍጠሪያ መሣሪያ + + የሚፈጠረው የትር ብዛት + + ወደ ንቁ ትሮች ያክሉ + + ወደ ቦዘኑ ትሮች ያክሉ + + ወደ የግል ትሮች ያክሉ diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index fd248b0ff146..efe32e77e8d4 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -67,11 +67,6 @@ Не пакідайце слядоў на гэтай прыладзе - - %1$s выдаляе кукі, гісторыю і дадзеныя сайтаў, калі вы закрываеце ўсе прыватныя вокны. %2$s Знайсці на старонцы + + Перакласці старонку Захаваць у калекцыі @@ -329,14 +326,8 @@ Не зараз - - Зрабіце Firefox сваім паўсядзённым браўзерам Нам падабаецца забяспечваць вашу бяспеку - - Firefox ставіць людзей вышэй за прыбытак і абараняе вашу прыватнасць, блакуючы міжсайтавыя трэкеры.\n\nДаведайцеся больш у нашым паведамленні аб прыватнасці. Наш браўзер, падтрыманы некамерцыйнай арганізацыяй, дапамагае абмяжоўваць кампаніі ад сачэння за вамі ў Інтэрнэце.\n\nДаведайцеся больш у нашым паведамленні аб прыватнасці. Не зараз - Пераходзьце з тэлефона на ноўтбук і назад - Заставайцеся зашыфраванымі падчас пераходу паміж прыладамі - - Вазьміце карткі і паролі з іншых прылад, каб працягнуць з таго месца, дзе вы спыніліся. Калі вы ўвайшлі ў сістэму і правялі сінхранізацыю, вы ў большай бяспецы. Firefox шыфруе вашыя паролі, закладкі і многае іншае. @@ -360,15 +347,9 @@ Не зараз - - Апавяшчэнні дапамогуць вам зрабіць больш з Firefox Апавяшчэнні дапамагаюць вам заставацца ў бяспецы з Firefox - - Адпраўляйце карткі паміж прыладамі, кіруйце сцягваннямі і атрымлівайце парады, як максімальна выкарыстоўваць Firefox. Бяспечна перасылайце карткі паміж сваімі прыладамі і адкрыйце для сябе іншыя функцыі прыватнасці ў Firefox. @@ -409,8 +390,6 @@ Выберыце - Кіраванне цэтлікамі пашукавікоў - Кіраванне альтэрнатыўнымі пошукавымі сістэмамі Рэдагаваць сістэмы, бачныя ў меню пошуку @@ -424,8 +403,6 @@ Пошукавыя сістэмы Прапановы ад пошукавых сістэм - - Адрасны радок Настройкі адраснага радка @@ -549,14 +526,10 @@ Тым не менш, таксама магчыма, што зламыснік мае дачыненне. Калі вы пяройдзеце на сайт, вы не павінны ўводзіць ніякай канфідэнцыйнай інфармацыі. Калі вы працягнеце, рэжым «Толькі HTTPS» будзе часова адключаны для сайта. Даступнасць - - Уласны сервер уліковых запісаў Firefox Уласны сервер уліковых запісаў Mozilla Уласны сервер сінхранізацыі - - Сервер уліковага запісу Firefox/сінхранізацыі зменены. Выхад з праграмы, каб прымяніць змены… Сервер уліковых запісаў Mozilla/сінхранізацыі зменены. Выхад з праграмы, каб прымяніць змены… @@ -575,8 +548,6 @@ Увайсці, каб сінхранізаваць карткі, закладкі, паролі і іншае. - Уліковы запіс Firefox - Уліковы запіс Mozilla Падключыцеся, каб аднавіць сінхранізацыю @@ -588,8 +559,6 @@ Збор дадзеных Аддаленая адладка праз USB - - Паказаць пашукавікі Паказваць пошукавыя прапановы @@ -722,12 +691,6 @@ Азнаёмцеся з дадаткамі - - - Дадатак не падтрымліваецца - - Дадатак ужо ўсталяваны - Дадаткі часова адключаны @@ -1370,6 +1333,9 @@ Закрыць прыватныя карткі + + Закрыць прыватныя карткі? + Маркетынг @@ -1960,29 +1926,19 @@ Дадаць новы пашукавік Змяніць пашукавік - - Дадаць - - Захаваць Змяніць Выдаліць - - Іншы Назва - - Назва Назва пошукавай сістэмы URL радка пошуку - Пошукавы радок - URL для пошуку Змяніць запыт на “%s”. Прыклад:\nhttps://www.google.com/search?q=%s @@ -2218,8 +2174,6 @@ - Праверка водгукаў - Праверка водгукаў Надзейныя водгукі @@ -2232,7 +2186,7 @@ Скарэктаваны рэйтынг - Ненадзейныя водгукі выдалены + Ненадзейныя водгукі выдалены Асноўныя моманты з апошніх водгукаў @@ -2243,14 +2197,10 @@ літарную адзнаку ад A да F.]]> Надзейныя водгукі. Мы лічым, што водгукі, хутчэй за ўсё, ад сапраўдных кліентаў, якія пакінулі сумленныя, непрадузятыя водгукі. - - Мы лічым, што водгукі надзейныя. Мы лічым, што тут ёсць сумесь надзейных і ненадзейных водгукаў. Ненадзейныя водгукі. Мы лічым, што агляды, хутчэй за ўсё, падробленыя або ад неаб\'ектыўных аглядальнікаў. - - Мы лічым, што водгукі ненадзейныя. Скарэкціраваны рэйтынг заснаваны толькі на водгуках, якія мы лічым надзейнымі.]]> @@ -2266,8 +2216,6 @@ Паказваць рэкламу ў сродку праверкі водгукаў - Вы будзеце час ад часу бачыць рэкламу адпаведных тавараў. Усе аб’явы павінны адпавядаць нашым стандартам якасці водгукаў. %s - Вы будзеце час ад часу бачыць рэкламу адпаведных тавараў. Мы рэкламуем прадукты толькі з надзейнымі водгукамі. %s Падрабязней @@ -2290,23 +2238,21 @@ Калі на гэты прадукт будзе больш водгукаў, мы зможам праверыць іх якасць. - Прадукт недаступны + Прадукт недаступны - Калі вы ўбачыце гэты прадукт ізноў у наяўнасці, паведаміце нам пра гэта, і мы будзем правяраць водгукі. + Калі вы ўбачыце гэты прадукт ізноў у наяўнасці, паведаміце нам пра гэта, і мы будзем правяраць водгукі. - Паведаміць, што гэты прадукт ізноў у наяўнасці - - Паведаміць, што прадукт ёсць у наяўнасці + Паведаміць, што прадукт ёсць у наяўнасці - Праверка якасці водгукаў + Праверка якасці водгукаў - Праверка якасці водгукаў + Праверка якасці водгукаў Гэта можа заняць каля 60 секунд. - Дзякуй за паведамленне! + Дзякуй за паведамленне! - Мы павінны атрымаць інфармацыю аб водгуках аб гэтым прадукце на працягу 24 гадзін. Праверце зноў пазней. + Мы павінны атрымаць інфармацыю аб водгуках аб гэтым прадукце на працягу 24 гадзін. Праверце зноў пазней. Мы не можам праверыць гэтыя водгукі @@ -2344,17 +2290,17 @@ Даведацца больш - Выбіраючы «Так, паспрабаваць», вы пагаджаецеся з %2$s і %3$s ад %1$s ад Mozilla. + Выбіраючы «Так, паспрабаваць», вы пагаджаецеся з %2$s і %3$s ад %1$s ад Mozilla. - Выбіраючы «Так, паспрабаваць», вы згаджаецеся з наступным ад %1$s: + Выбіраючы «Так, паспрабаваць», вы згаджаецеся з наступным ад %1$s: - палітыкай прыватнасці + палітыкай прыватнасці - Палітыка прыватнасці + Палітыка прыватнасці - ўмовамі выкарыстання + ўмовамі выкарыстання - Умовы выкарыстання + Умовы выкарыстання Так, паспрабаваць @@ -2390,6 +2336,9 @@ Канкурэнтаздольнасць + + “%s” + згарнуць @@ -2407,4 +2356,155 @@ адкрыйце спасылку, каб даведацца больш %s, загаловак - + + Спасылкі + + Даступныя спасылкі + + + + + + Перакласці старонку? + + Падрабязней + + + Перакласці з + + Перакласці на + + Не зараз + + Гатова + + Перакласці + + Паспрабаваць зноў + + Пераклад + + Ідзе пераклад + + Узнікла праблема з перакладам. Калі ласка, паспрабуйце яшчэ раз. + + Падрабязней + + + + Параметры перакладу + + Заўсёды прапаноўваць пераклад + + Заўсёды перакладаць %1$s + + Ніколі не перакладаць %1$s + + Ніколі не перакладаць гэты сайт + + Налады перакладу + + Пра пераклады ў %1$s + + + + Пераклады + + Налады перакладу + + Аўтаматычны пераклад + + Ніколі не перакладаць гэтыя сайты + + Сцягнуць мовы + + + + Аўтаматычны пераклад + + + + Прапаноўваць пераклад (прадвызначана) + + Заўсёды перакладаць + + Ніколі не перакладаць + + + + Ніколі не перакладаць гэтыя сайты + + Выдаліць %1$s + + Выдаліць %1$s? + + Выдаліць + + Скасаваць + + + + Сцягнуць мовы + + Падрабязней + + Даступныя мовы + + патрэбны + + %1$s (%2$s) + + Сцягнуць мовы + + Усе мовы + + Выдаліць + + У працэсе + + Сцягнуць + + Выбрана + + + Выдаліць %1$s (%2$s)? + + Выдаліць усе мовы (%1$s)? + + Выдаліць + + Скасаваць + + + Сцягнуць + + Сцягнуць і перакласці + + Скасаваць + + + + Інструменты адладкі + + Перайсці назад + + Інструменты картак + + Колькасць картак + + Дзейныя + + Неактыўныя + + Прыватныя + + Усяго + diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index f3fec696d97e..0e8e7b1ce4a8 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -51,6 +51,8 @@ Последно запазени + + Всички запазени отметки Премахване @@ -63,16 +65,49 @@ %1$s изчиства вашата история на търсене и разглеждане от поверителните раздели, когато ги затворите или излезете от приложението. Това не ви прави невидими за уебсайтовете или мрежовите доставчици, но запазва поверителността на вашата дейност онлайн от други ползватели на същото устройството. Разпространени легенди относно поверителното разглеждане + + + Без никакви следи на устройството + + %1$s изтрива бисквитките, историята и данни от разглеждането, когато затворите всички поверителни раздели. %2$s + + Кой би могъл да види моята дейност? + + + + Поверителен раздел с едно докосване. Добавяне към екрана Не, благодаря + + + Може да настроите %1$s автоматично да отваря препратки в приложения. Към настройки Прекратяване + + + Най-мощната ни поверителна функция е прекратяването на проследяването в различни сайтове. + + + + Научете за Цялостната защита на бисквитките + + + + + Докоснете, за да отворите нова поверителна сесия. Изтрийте историята, бисквитките — всичко. + + Необходим е достъп до камерата. Отворете настройките на Android, докоснете разрешения и изберете разрешаване. @@ -110,12 +145,21 @@ Нов поверителен раздел + + Пряк път за пароли + Върнете се към Показване на всички + + Бутон за показване на всички скорошни раздели + + Всички синхронизирани раздели + + Синхронизирано устройство Премахване Премахване + + Всички минали проучвания + Назад @@ -156,6 +203,8 @@ Библиотека Настолна версия + + Отваряне в обикновен раздел Добавяне към екрана @@ -199,6 +248,9 @@ Начален екран + + Изчистване историята на разглеждане Избран език @@ -212,7 +264,7 @@ Сканиране - Търсеща машина + Търсеща машина Настройки на търсачките @@ -227,7 +279,7 @@ %s ще споделя със стандартната търсачката, въвежданото в адресната лента. - + Търсене с %s Търсете директно от адресната лента @@ -235,9 +287,92 @@ Настройки на търсене + + Търсене в: + + Търсеща машина от %s + + + + Запознайте се с вашата персонализирана начална страница. Тук ще се покажат последните раздели, отметки и резултати от търсене. + + Добре дошли в един по-личен интернет + + По-шарен. С по-добра поверителност. Със същия ангажимент към хората, вместо към печалбата. + + Превключването на екрани е по-лесно от всякога + + Продължете с разделите от други устройства, откъдето бяхте преди. Те вече са на началната ви страница. Въведение + + Вписване + + Пропускане + + Вашите раздели се синхронизират! Продължете откъдето сте спрели на другото си устройство. + + Затваряне + + + + Известията ви помагат да правите повече с %s + + Синхронизирайте вашите раздели между устройствата, управлявайте изтеглянията, получавайте съвети как да се възползвате максимално от защитата на поверителността на %s и много други. + + Продължаване + + Не сега + + + + Обичаме да ви пазим в безопасност + + Нашият четец, разработван от организация с нестопанска цел ви помага да не бъдете следени тайно в мрежата.\n\nНаучете повече в нашето съобщение за поверителност. + + политика на поверителност + + Задаване като четец по подразбиране + + Не сега + + Шифровайте връзката си и когато сменяте устройствата + + Когато сте влезли и сте синхронизирани, вие сте в по-голяма безопасност. Firefox криптира вашите пароли, отметки и др. + + Вписване + + Не сега + + Известията ви помагат да сте в по-голяма безопасност с Firefox + + Защитено изпращане на раздели между вашите устройства и откриване на други функции за поверителност във Firefox. + + Включване на известията + + Не сега + + Опитване на приспособлението за търсене на Firefox + + С Firefox на началния екран ще имате лесен достъп до водещия браузър за защита на личните данни, който блокира проследяващи устройства за различни сайтове. + + Добавяне на джаджа за Firefox + + Не сега + + + + Отваряне на раздел с %1$s Търсене @@ -253,12 +388,28 @@ Общи Относно + + Изберете + + Управляване на алтернативни търсачки + + Редактиране на търсачки, видими в менюто за търсене + + Търсачки в менюто за търсене Стандартна търсеща машина Търсене - - Адресна лента + + Търсещи машини + + Предложения от търсачките + + Предпочитания за адресника + + Адресник - Firefox Suggest + + Научете повече за Firefox Suggest Оценете в Google Play - Намаляване на банерите за бисквитки + Намаляване на банерите за бисквитки + + Блокиране на банери за бисквитки + + Блокиране на банери за бисквитки при поверително сърфиране + + Намаляване на банерите за бисквитки + + Изключено + + Включено + + %1$s автоматично се опитва да отхвърли заявки за бисквитки от банери за бисквитки. + + Изключено за страницата + + Отказ + + Заявяване + + Ще заявите ли поддръжка за тази страница? + + Заявката е изпратена + + Включено за страницата + + Заявката за поддръжка е изпратена + + Страницата не се поддържа - Включване на намаляването на банерите за бисквитки за %1$s? + Включване на намаляването на банерите за бисквитки за %1$s? + + Включване на скриването на банери за бисквитки за %1$s? - Изключване на намаляването на банерите за бисквитки за %1$s? - - Намаляване на банерите за бисквитки + Изключване на намаляването на банерите за бисквитки за %1$s? - - Включено + + Изключване на скриването на банери за бисквитки за %1$s? + + %1$s не може автоматично да отхвърля заявките за бисквитки на този сайт. Можете да изпратите заявка за поддръжка на този сайт в бъдеще. + + %1$s ще изчисти бисквитките на този сайт и ще презареди страницата. Изчистването на всички бисквитки може да ви отпише от системата или да изпразни количките ви за пазаруване. + + Изключете и %1$s ще изчисти бисквитките и ще презареди този сайт. Това може да доведе до излизане от профила или изпразване на количките. + + %1$s се опитва автоматично да отхвърли всички заявки за бисквитки на поддържаните сайтове. + + Включете и %1$s ще се опита автоматично да откаже всички банери за бисквитки на този сайт. + + Да се разреши ли на %1$s да отхвърля банери за бисквитки? + + %1$s може автоматично да отхвърли много заявки за банери за бисквитки. + + Не сега + + Ще виждате по-малко заявки за бисквитки + + Разрешаване + + %1$s току-що отказа бисквитки вместо вас + + По-малко разсейване, по-малко бисквитки, които ви проследяват на този сайт. + + + Автоматично се опитва да се свърже със сайтове, използвайки HTTPS протокол за криптиране за повишена сигурност. Изключено + + Във всички раздели + + Само в поверителни раздели Научете повече + + Активиране във всички раздели + + Включване само в частни раздели + + Сигурният сайт не е наличен + + Най-вероятно страницата не се поддържа под HTTPS. + + Въпреки това е възможно също да е замесен нападател. Ако продължите към уебсайта, не трябва да въвеждате чувствителна информация. Ако продължите, режимът само HTTPS ще бъде изключен временно за сайта. Достъпност - - Личен сървър за Firefox Account + + Персонализиран сървър за профили на Mozilla Личен сървър за Sync - - Сървърът на Firefox Account/Sync е променен. Излизане от приложението за прилагане на промените… + + Променен акаунт в Mozilla/Sync. Излизане от приложението за прилагане на промените… Профил @@ -322,8 +542,10 @@ Жестове Външен вид + + Впишете се, за да синхронизирате раздели, отметки, пароли и други. - Firefox Account + сметка в Mozilla Свържете повторно, за да бъде възобновено синхронизирането @@ -334,8 +556,6 @@ Събирани данни Отдалечено отстраняване на дефекти през USB - - Показване на търсещи машини Показване на предложения @@ -354,16 +574,45 @@ Настройки на профил Автоматично довършване на адреси + + Предложения от спонсори + + Подкрепете %1$s с от време на време спонсорирани предложения + + Предложения от %1$s + + Получавайте предложения от мрежата, свързани с търсенето ви Отваряне на препратки в приложения + + Винаги + + Питайте преди отваряне + + Никога Външно приложение за изтегляния + + + Активиране на журналите на Gecko + + Приложението се затваря за прилагане на промени… + Добавки + + Инсталиране на добавка от файл Известия + + Разрешено + + Забранено + Персонализиран списък от добавки @@ -387,18 +636,72 @@ a section where users see a list of tabs that they have visited in the past few days --> Наскоро посетени + + Истории, навеждащи на размисъл + + Статии, предоставени от %s + + Платени публикации Тапети Спонсорирани препратки - - - Добавката не се поддържа - - Добавката вече е инсталирана + + + Тапет: %1$s + + Тапетът е променен! + + Преглед + + + Тапетът не можа да бъде изтеглен + + Повторен опит + + Тапетът не можа да бъде сменен + + Научете повече + + Класически %s + + + Серия за художници + + Колекцията независими гласове. %s + + Колекцията независими гласове. + + Опитайте пръска цвят + + Изберете тапет, който говори за вас. + + Разгледайте още тапети + + + + Налични са нови добавки + + Вижте 100+ нови разширения, които ви позволяват да направите Firefox ваш. + + Разгледайте добавките + + + + Добавките са временно изключени + + Една или повече добавки са спрели да работят, като намаляват стабилността на системата. %1$s направи опит да ги рестартира, но без успех.\n\nТези добавки няма да работят в текущата сесия.\n\nПремахването или изключването на добавки може да реши този проблем. + + Опит за рестарт на добавките + + Изключване на добавките + + Управление на профила + + Променете паролата си, управлявайте събирането на данни или изтрийте профила си Синхронизиране @@ -470,6 +773,9 @@ Позволява на Mozilla да инсталира и изпълнява проучвания + + + Синхронизиране и запазване на данни Влезте, за да свържете отново @@ -530,12 +836,23 @@ Затваряне - - %d страница - - %d страници + + Отваряне на %d раздела? + + Отварянето на толкова много раздели може да забави %s, докато страниците се зареждат. Сигурни ли сте, че искате да продължите? + + Отворени раздели + + Отказ + + + %d страница + + %d страници Последно затворени раздели @@ -592,6 +909,13 @@ Затваряне след един месец + + Отваряне на началната страница + + Отваряне на последния раздел + + Отваряне на началната страница след четири часа + Преместване на старите раздели в неактивни @@ -603,6 +927,8 @@ Премахване Активни + + %1$s може от време на време да инсталира и извършва проучвания. Научете повече @@ -671,15 +997,18 @@ Отваряне на раздели Наименование на списък - - Преименуване - - Премахване + + Преименуване + + Премахване Премахване от историята %1$s (поверителен режим) + + + Въведете търсене Изчистване на история @@ -737,6 +1066,8 @@ Наистина ли искате да изтриете папката? %s ще изтрие избраните елементи. + + Отказ Добавяне на папка @@ -753,6 +1084,10 @@ Отваряне в нов раздел Отваряне в поверителен раздел + + Отваряне на всички в нови раздели + + Отваряне на всички в поверителни раздели Изтриване @@ -793,6 +1128,9 @@ ОТМЕНЯНЕ + + Въведете търсене + Към настройките @@ -806,8 +1144,16 @@ Изчистване на правата + + Добре + + Отказ Изчистване на правото + + Добре + + Отказ Изчистване на правата на всички страници @@ -822,6 +1168,8 @@ Известия Постоянно хранилище + + Бисквитки между сайтове Съдържание под DRM @@ -835,10 +1183,14 @@ Изключения - - Включено Изключено + + Стандартна + + Строга + + По избор Разрешаване на звук и видео @@ -907,6 +1259,11 @@ Преглед + + Добре + + Отказ + Списък %d @@ -917,6 +1274,18 @@ "Share" button. Opens the share menu when pressed. --> Споделяне + + Запазване като PDF + + Не може да бъде създаден PDF + + Прекратяване + + Грешка при отпечатване + + Страницата не може да бъде отпечатана + + Отпечатване Изпращане към устройство @@ -925,9 +1294,13 @@ Последно използвани Копиране в системния буфер + + Копирано Вписване в Sync - + + Синхронизиране и запазване на данни + Изпращане до всички устройства Повторно свързване със Sync @@ -954,9 +1327,46 @@ Затваряне на поверителни раздели + + + Затваряне на поверителни раздели? + Докоснете или плъзнете това известие, за да затворите поверителни раздели. + Маркетинг + + Firefox е бърз и поверителен + + Направете Firefox вашия четец по подразбиране + + Пробвайте поверително разглеждане + + Разглеждайте без запазени бисквитки или история в %1$s + + Преглеждайте без следа + + + Поверителното разглеждане в %1$s не пази информация. + + Направете първото си търсене + + + Намерете нещо наблизо. Или да откриете нещо забавно. + + + + Помогнете да подобрим Firefox, участвайки в кратко допитване. + + Участвайте в допитване + + Не, благодаря + Списъкът е изтрит @@ -968,10 +1378,14 @@ Разделите са затворени Отметките са запазени! + + Добавено към преки пътища! Поверителният раздел е затворен Поверителните раздели са затворени + + Личните данни за сърфиране са изтрити ОТМЕНЯНЕ @@ -1021,12 +1435,13 @@ %d раздела - История на разглеждане и данни от страници + + История на разглеждане %d адреса - - Бисквитки + + Бисквитки и данни на страници Ще бъдете отписани от повечето страници @@ -1046,6 +1461,19 @@ Изход + + Времеви обхват за изчистване + + Премахва история (включително история, синхронизирана от други устройства), бисквитки и друга информация за сърфирането. + + Премахва история (включително история, синхронизирана от други устройства) + + Последения час + + Днес и вчера + + Всичко + %s ще изтрие избраните данни от историята на разглеждане. @@ -1059,39 +1487,20 @@ Изтриване на данни от разглеждане… + + Премахване на страниците от „%s“ + + Отказ + + Премахване + + Групата е премахната + + Синхронизирането е включено - - Стандартна (подразбиране) - - Баланс между поверителност и бързодействие. Страниците се зареждат нормално. - - Строга - - Спира повече проследявания, така че страниците зарежда по-бързо, но някои функции на страницата може да не работят. - - Изберете място на лентата с инструменти - - Бележка за поверителността - - - Започнете да разглеждате - - Изберете тема - - - Запазете батерия и зрението си с тъмна тема. - - Автоматичнa - - Приспособява се към настройките на устройството - - Тъмна тема - - Светла тема - Разделите са изпратени! @@ -1128,25 +1537,24 @@ Настройки на защитата Подобрена защита от проследяване - - Разглеждайте без да сте следени - - - Пазете вашите данни лични. %s ви предпазва от най-разпространените проследявания, които дебнат действията ви онлайн. + + Вече включва цялостна защита на бисквитките, най-мощната ни бариера срещу проследяване в различни сайтове. + + %s ви предпазва от много от най-разпространените проследявания, които следят какво правите онлайн. Научете повече Стандартна (подразбиране) - Баланс между поверителност и бързодействие. Страниците се зареждат нормално. + Страниците ще зареждат нормално, но ще блокират по-малко тракери. Какво е спряно от стандартната защита от проследяване Строга - Спира повече проследявания, така че страниците зарежда по-бързо, но някои функции на страницата може да не работят. + По-силна защита от проследяване и по-бърза производителност, но някои сайтове може да не работят правилно. Какво е спряно от строгата защита от проследяване @@ -1166,6 +1574,10 @@ Всички бисквитки от трети страни (може наруши работата на страници) Всички бисквитки (ще наруши работата на страници) + + Изолиране на бисквитки в различни сайтове + + Кажете на уебсайтовете да не споделят и продават данни Проследяващо съдържание @@ -1188,8 +1600,12 @@ Ограничава възможността социалните мрежи да проследяват вашата активност в Мрежата. Бисквитки за следене в различни сайтове + + Бисквитки между сайтове Спира бисквитки, които компаниите за реклама и анализ използват за събиране на ваши данни от посещения в множество страници. + + Цялостната защита на бисквитките изолира бисквитките само до страницата на която сте, така че механизмите за проследяване да не могат да ви проследят в различни сайтове. Добиване на криптовалути @@ -1224,9 +1640,16 @@ Изчиства бисквитки за пренасочване към известни проследяващи страници. + + Някои проследявания, отбелязани по-долу, са частично деблокирани на страницата, защото сте взаимодействали с тях *. Научете повече + + Икона за предпочитание за изключение с подобрена защита от проследяване + Поддръжка @@ -1358,6 +1781,9 @@ Меню за сортиране на регистрации + + + Автоматично попълване Адреси @@ -1380,6 +1806,11 @@ Управление на адреси + + Запазване и попълване на адреси + + Включително номера, електронни адреси и адреси за доставка + Добавяне на карта @@ -1398,6 +1829,10 @@ Изтриване на картата Изтриване на картата + + Сигурни ли сте, че искате да премахнете тази банкова карта? + + Премахване Запазване @@ -1426,34 +1861,87 @@ Отключете, за да използвате запазената банкова карта + + Добавяне на адрес + + Промяна на адрес + + Управление на адреси Първо име + + Презиме + + Фамилия + + Адрес + + Град + + Състояние + + Провинция + + Пощенски код + + Държава или район + + Телефон + + + Адрес на ел. поща + + Запазване + + Отказ + + Премахване на адреса + + Сигурни ли сте, че искате да премахнете този адрес? + + Премахване + + Отказ + + Запазване на адреса + + Премахване на адреса + Добавяне на търсеща машина + + Добавяне на търсеща машина Промяна на търсеща машина - - Добавяне - - Запазване Променяне Премахване - - Друга - - Име + + Наименование + + Име на търсеща машина + + Адрес на низа за търсене - Низ за търсене, който да се използва + Адресът, който да бъде използван при търсене Заменете заявката с „%s“. Пример:\nhttps://www.google.com/search?q=%s Данни за търсещата машина на потребителя + + ППИ за предложения при търсене (по избор) + + Адрес на ППИ за предложения при търсене + + Заменете заявката за търсене с „%s“. Пример:\nhttps://suggestqueries.google.com/complete/search?client=firefox&q=%s + + Запазване + Въведете име на търсещата машина @@ -1484,6 +1972,10 @@ Връзката е защитена Връзката не е защитена + + Изчистване на бисквитките и данните на сайта + + %s?]]> Сигурни ли сте, че искате да премахнете всички права за всички страници? @@ -1494,6 +1986,10 @@ Няма изключения Сигурен ли сте, че искате да изтриете отметката? + + Добавяне към преки пътища + + Премахване от преките пътища Проверено от: %1$s @@ -1505,6 +2001,8 @@ Сигурни ли сте, че искате да изтриете тези данни за вход? Изтриване + + Отказ Настройки за вход @@ -1557,15 +2055,36 @@ Няма отворени раздели + + Разгъване на групата синхронизирани раздели + + Свиване на групата синхронизирани раздели + + + + Пределът за преки пътища е достигнат + + За да добавите нов пряк път, премахнете такъв. Докоснете и задръжте страницата и изберете премахване. Добре, разбрах + + Бързи клавиши - Наименование + Наименование + + Име на пряк път - Добре - - Отказ + Добре + + Отказ + + + Настройки + + Спонсори и поверителност + + Спонсорирано @@ -1573,6 +2092,11 @@ Затваряне на всички неактивни раздели + + Разгъване на неактивните раздели + + Сгъване на неактивните раздели + Автоматично затваряне след един месец? @@ -1583,6 +2107,14 @@ Автоматичното затваряне е включено + + + Предложение от Firefox + + Търсене в Гугъл + + Търсене с %s + Задайте Firefox като стандартно приложение за отваряне на страници, електронна поща и съобщения. @@ -1605,9 +2137,379 @@ Истории по тема Открийте повече + + С подкрепата на %s. Част от семейството на Firefox. %s Научете повече + + Спонсорирано + + + Активирайте телеметрията за изпращане на данни. + + Към настройки + + + + Проверка за преглед + + Надеждни отзиви + + Смесица от надеждни и ненадеждни отзиви + + Ненадеждни отзиви + + Колко надеждни са тези отзиви? + + Коригиран рейтинг + + Ненадеждните отзиви са премахнати + + Въз основа на надеждни отзиви + + Акценти от скорошни рецензии + + Как определяме качеството на отзивите + + Използваме AI технологията на %s от Mozilla, за да проверим надеждността на отзивите за продукти. Това ще ви помогне да оцените само качеството на отзивите, а не качеството на продукта. + + буквична оценка от A до F.]]> + + Надеждни отзиви. Вярваме, че рецензиите са вероятни от реални клиенти, оставили честни и безпристрастни отзиви. + + Вярваме, че има комбинация от надеждни и ненадеждни отзиви. + + Ненадеждни отзиви. Вярваме, че отзивите вероятно са фалшиви или от пристрастни рецензенти. + + Коригираната оценка се основава само на отзиви, които смятаме за надеждни.]]> + + Акцентите са от %s отзиви през последните 80 дни, които смятаме за надеждни.]]> + + Научете повече за %s. + + как %s от Mozilla определя качеството на рецензията + + как %s определя качеството на рецензията + + Настройки + + Показване на рекламите в програмата за прегледи + + От време на време ще виждате реклами на подходящи продукти. Ние рекламираме само продукти с надеждни отзиви. %s + + Научете повече + + Изключване на проверката за рецензии + + Повече за разглеждане + + Реклама от %s + + Проверката на отзиви се поддържа от %s + + %s от Mozilla + + Нова информация за проверка + + Проверяване + + + Все още няма достатъчно отзиви + + Когато този продукт има повече отзиви, ще можем да проверим качеството им. + + Продуктът не е наличен + + Ако видите, че продуктът е отново в наличност, докладвайте и ще работим върху проверка на отзивите. + + Докладвайте продукта е наличен + + Проверяване на качеството на отзива + + Проверяване на качеството на отзива + + Проверка на качеството на рецензията (%s) + + Това може да отнеме около 60 секунди. + + Благодарим ви, че докладвахте! + + Би трябвало да имаме информация за отзивите на този продукт в рамките на 24 часа. Моля, проверете отново. + + Не можем да проверим тези отзиви + + За съжаление, не можем да проверим качеството на отзивите за определени видове продукти. Например карти за подарък и поточно видео, музика и игри. + + Информация очаквайте скоро + + Би трябвало да имаме информация за отзивите на този продукт в рамките на 24 часа. Моля, проверете отново. + + Анализът е актуален + + Разбрах + + В момента няма налична информация + + Работим за разрешаване на проблема. Моля, проверете отново по-късно. + + Няма мрежова връзка + + Проверете мрежовата си връзка и опитайте да презаредите страницата. + + Все още няма информация за тези отзиви + + За да разберете дали отзивите за този продукт са надеждни, проверете качеството им. Отнема само около 60 секунди. + + Проверете качеството на отзивите + + Опитайте нашето надеждно ръководство за отзиви за продукти + + Вижте колко надеждни са отзивите за продукта в %1$s, преди да купите. Проверка на рецензиите, експериментална функция от %2$s, е вградена директно в браузъра. Работи и на %3$s и %4$s. + + Вижте колко надеждни са отзивите за продукта в %1$s, преди да купите. Проверка за преглед, експериментална функция от %2$s, е вградена директно в браузъра. + + Използвайки мощта на %1$s от Mozilla, ние ви помагаме да избегнете необективни и недостоверни рецензии. Нашият AI модел винаги се подобрява, за да ви защитава, докато пазарувате. %2$s + + Научете повече + + С избирането на „Да, изпробвайте“ вие се съгласявате със следното от %1$s: + + декларация за поверителност + + Политика на поверителност + + условия за ползване + + Условия за употреба + + Не сега + + Разберете дали можете да се доверите на отзивите за този продукт — преди да закупите. + + Опитайте проверка на отзиви + + Тези отзиви надеждни ли са? Проверете сега, за да видите коригирана оценка. + + Отваряне на проверка за отзиви + + Beta + + Отваряне на проверка за отзиви + + Затваряне на програмата за преглед + + %1$s от 5 звезди + + По-малко + + Повече + + Качество + + Цена + + Доставка + + Опаковка и външен вид + + Конкурентоспособност + + „%s“ + + + + срив + + свито + + разгънете + + разширено + + отворете връзката, за да научите повече за тази колекция + + прочетете статията + + отворете препратката, за да научите повече + + %s, Заглавие + + + Препратки + + Налични връзки + + + + + + език. Превеждане на страницата? + + Опитайте с поверителни преводи след %1$s + + За ваша поверителност, преводите никога не напускат устройството ви. Нови езици и подобрения очакват скоро! %1$s + + Научете повече + + Превеждане от + + Превеждане на + + Не сега + + Превеждане + + Превеждане + + Превеждането е в процес на изпълнение + + + + Настройки на превода + + Винаги предлагайте превод + + %1$s винаги се превежда + + Без превод на %1$s + + Без превод на този сайт + + Настройки на превода + + Относно преводите от %1$s + + + + Преводи + + Предложете превод, когато е възможно + + Езиците се изтеглят винаги в режим за икономия на данни + + Настройки на превода + + Автоматичен превод + + Тези сайтове никога да не бъдат превеждани + + Изтегляне на езици + + + + Автоматичен превод + + Изберете език, който да управлявате „винаги превежда“ и „never translate“. + + + + Предложение за превод (по подразбиране) + + %1$s ще предлага превод на сайтове на този език. + + Винаги да се превежда + + %1$s ще преведе този език автоматично при зареждане на страницата. + + Никога да не се превежда + + %1$s никога няма да предложи превод на сайтове на този език. + + + + Тези сайтове никога да не бъдат превеждани + + За да добавите нов сайт: Посетете го и изберете „Never translate this site“ от менюто за превод. + + Премахване на %1$s + + Изтриване на %1$s? + + Изтриване + + Отказ + + + + Изтегляне на езици + + Изтеглете цялостни езици за по-бързи преводи, както и за преводи офлайн. %1$s + + Научете повече + + Достъпни езици + + задължителен + + %1$s (%2$s) + + Изтегляне на езици + + Всички езици + + Изтриване + + Изпълнява се + + Изтегляния + + Избрано + + + Изтриване на %1$s (%2$s)? + + Ако изтриете този език, %1$s ще изтегли частични езици в склада ви, докато превеждате. + + Изтриване на всички езици (%1$s)? + + Ако изтриете всички езици, %1$s ще изтегли частични езици в склада ви, докато превеждате. + + Изтриване + + Отказ + + + Изтегляне в режим за икономия на данни (%1$s)? + + Изтегляне на частични езици в склада, за да запазим преводите поверителни. + + Изтегляне винаги в режим за пестене на данни + + Изтегляния + + Изтеглете и преведете + + Отказ + + + + Инструменти за отстраняване на грешки + + Връщане назад + + Инструменти за раздели + + Брой на разделите + + Включен + + Изключени + + Лични + + Всичко diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index fdc252012eb0..f80f2a7e08b2 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -200,6 +200,8 @@ Adgoubredañ Kavout er bajennad + + Treiñ ar bajenn Enrollañ en dastumad @@ -310,14 +312,8 @@ Ket bremañ - - Lakait Firefox da vezañ ho merdeer dre ziouer Ho surentez a zo talvoudus deomp - - Firefox a lak an dud a-raok an arc’hant ha difenn a ra ho puhez prevez en ur stankañ an heulierien etre al lec’hiennoù. \n\nDeskit hiroc’h en hor evezhiadennoù a-fet buhez prevez. evezhiadennoù a-fet buhez prevez @@ -325,23 +321,13 @@ Lakaat da verdeer dre ziouer Ket bremañ - - Tremenit deus ar pellgomz d’an urzhiataer hezoug hag ar c’hontrol - - Adtapit ivinelloù ha gerioù-tremen diouzh ho trevnadoù all evit distreiñ e-lec’h ma oac’h. Kennaskañ Ket bremañ - - Gant ar rebuzadurioù e c’hallit ober muioc’h a draoù gant Firefox Gant ar rebuzadurioù e c’hallit chom suroc\'h gant Firefox - - Kasit ivinelloù etre ho trevnadoù, merit pellgargadurioù, lennit alioù evit tapout seizh gwellañ gwarez buhez prevez Firefox. Gweredekaat ar rebuzadurioù @@ -370,7 +356,7 @@ Dibabit unan - Merañ ar berradennoù klask + Merañ al luskerioù enklask all Embann al luskerioù a c’haller gwelet el lañser klask @@ -381,8 +367,8 @@ Klask Luskerioù klask - - Barrenn chomlecʼhioù + + Kinnigoù al luskerioù enklask Barrenn chomlec\'hioù - Alioù Firefox @@ -484,14 +470,10 @@ Posupl eo ivez e vefec’h taget, avat. Ma kendalc’hit war al lec’hienn e rankfec’h chom hep lakaat titouroù kizidik. Ma kendalc’hit e vo ivez diweredekaet ar mod HTTPS-hepken war al lec’hienn pad ur mare. Haezadusted - - Dafariad kont Firefox personelaet Dafariad kont Mozilla personelaet Dafariad Sync personelaet - - Dafariad kont Firefox/Sync kemmet. Kuitaet e vo an arload evit arloañ ar cʼhemmoù… Kont @@ -507,8 +489,6 @@ Kennaskit evit goubredañ an ivinelloù, sinedoù, gerioù-tremen ha muioc’h c’hoazh. - Kont Firefox - Kont Mozilla Adkennaskit evit kendercʼhel gant ar goubredañ @@ -520,8 +500,6 @@ Dastum roadennoù Diveugañ a-bell dre USB - - Diskouez al luskerioù klask Diskouez kinnigoù ar cʼhlask @@ -564,6 +542,8 @@ Askouezhioù + + Staliañ un askouezh diouzh ar restr Rebuzadurioù @@ -644,12 +624,8 @@ Askouezhioù nevez zo da gaout - - - Ne vez skoret an enlugellad-mañ - - - An enlugellad-mañ a zo bet staliet endeo + + Ergerzhout an askouezhioù @@ -1381,6 +1357,8 @@ %d chomlec’h + + Toupinoù ha roadennoù lec’hienn Digennasket e viot eus darn al lec’hiennoù @@ -1849,28 +1827,18 @@ Ouzhpennañ ul lusker enklask nevez Embann al lusker klask - - Ouzhpennañ - - Enrollañ Embann Dilemel - - All Anv - - Anv Anv ar c’heflusker enklask URL ar chadenn glask - Testenn glask da implij - URL da implij evit ar c’hlask Amsaviñ ar gerioù klasket gant “%s”. Da skouer: \nhttps://www.google.com/search?q= %s @@ -1881,6 +1849,8 @@ API alioù klask (diret) URL API an alioù klask + + Erlec’hiañ ar c’hlask gant “%s”. Skouer:\nhttps://suggestqueries.google.com/complete/search?client=firefox&q=%s Enrollañ @@ -2097,8 +2067,6 @@ - Gwirier alioù - Gwirier alioù Alioù fizius @@ -2109,13 +2077,9 @@ Pegen fizius eo an alioù-se? - Alioù disfizius dilamet + Alioù disfizius dilamet Penaos e termenomp perzhded an alioù - - D’hor soñj e c’haller kaout fiziañs en alioù-se. - - Ni a soñj deomp ez eo fizius an alioù-se. Gouzout muioc’h diwar-benn %s. @@ -2136,20 +2100,24 @@ Bruderezh gant %s %s gant Mozilla + + Titouroù nevez da wiriañ Gwiriañ bremañ N\'eus ket a-walc’h a alioù c\'hoazh - Dihegerz eo ar produ-mañ + Dihegerz eo ar produ-mañ - O wiriañ perzhded an ali + O wiriañ perzhded an ali - O wiriañ perzhded an ali + O wiriañ perzhded an ali + + O wiriañ kalite an alioù (%s) Gallout a ra padout tro-dro 60 eilenn. - Trugarez da vezañ danevellet! + Trugarez da vezañ danevellet! N’hallomp ket gwiriañ an alioù-mañ @@ -2160,6 +2128,8 @@ Titour ebet da gaout evit ar mare Kennask ebet ouzh ar rouedad + + Gwiriit ma’z oc’h kennasket ouzh ar genrouedad ha klaskit adkargañ ar bajenn. Titour ebet diwar-benn an alioù-se c’hoazh @@ -2167,13 +2137,13 @@ Gouzout hiroc’h - politikerezh a-fet buhez prevez + politikerezh a-fet buhez prevez - Politikerezh a-fet buhez prevez + Politikerezh a-fet buhez prevez - termenoù implij + termenoù implij - Termenoù implij + Termenoù implij Ya, esaeañ anezhañ @@ -2205,6 +2175,9 @@ Kevezerezh + + “%s” + bihanaat @@ -2220,4 +2193,130 @@ lenn ar pennad digeriñ an ere da c’houzout hiroc’h + + + %s, titl + + + + + + Treiñ ar bajennad-mañ? + + Gouzout hiroc’h + + Treiñ diwar + + Treiñ e + + Diwezhatoc’h + + Graet + + Treiñ + + Klask en-dro + + O treiñ + + + O treiñ + + Ur gudenn zo bet gant an droidigezh. Klaskit en-dro. + + N’haller ket kargañ ar yezhoù. Gwiriit ma’z oc’h kennasket ouzh ar genrouedad. + + Hon digarezit, n’eo ket skoret ar yezh "%1$s" c’hoazh. + + Gouzout hiroc’h + + + Na dreiñ biken %1$s + + Na dreiñ biken al lec’hienn-mañ + + Diwar-benn an treiñ e-barzh %1$s + + + + Troidigezhioù + + Penndibaboù treiñ + + Troidigezh emgefreek + + Na dreiñ biken al lec’hiennoù-mañ + + Pellgargañ yezhoù + + + + Troidigezh emgefreek + + + Na dreiñ biken + + + Lemel %1$s + + Dilemel %1$s? + + Dilemel + + Nullañ + + + + Pellgargañ yezhoù + + Gouzout hiroc’h + + rekis + + %1$s (%2$s) + + Pellgargañ yezhoù + + An holl yezhoù + + Dilemel + + War ober + + Pellgargañ + + Diuzet + + + Dilemel %1$s (%2$s)? + + Dilemel an holl yezhoù (%1$s)? + + Dilemel + + Nullañ + + + Pellgargañ + + Pellgargañ ha treiñ + + Nullañ + + + Oberiant + + Dizoberiant + + Prevez + + Hollad diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 08fc543179b5..51cac9c00f86 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -65,11 +65,6 @@ Ne ostavljaj tragove na ovom uređaju - - %1$s briše vaše kolačiće, historiju i podatke o web stranici kada zatvorite sve svoje privatne prozore. %2$s - - Učinite Firefox vašim glavnim pretraživačem Volimo da vas čuvamo - - Firefox stavlja ljude iznad profita i brani vašu privatnost blokiranjem praćenja na različitim lokacijama.\n\nSaznajte više u našoj obavijesti o privatnosti. Naš neprofitni pretraživač pomaže spriječiti kompanije da vas potajno prate širom weba.\n\nSaznajte više u našem obavještenju o privatnosti. Ne sada - Prebacite se sa telefona na laptop i nazad - Ostanite šifrovani kada prelazite s jednog uređaja na drugi - - Dohvatite otvorene tabove i lozinke s vašeg drugog uređaja i nastavite gdje ste stali. Kada ste prijavljeni i sinhronizovani, sigurniji ste. Firefox šifruje vaše lozinke, oznake i još mnogo toga. @@ -347,17 +332,11 @@ Prijava Ne sada - - Obavještenja vam pomažu da učinite više sa Firefoxom Obavještenja vam pomažu da ostanete sigurniji sa Firefoxom - - Šaljite tabove između uređaja, upravljajte preuzimanjima i dobijajte savjete o tome kako iskoristiti Firefox na najbolji način. Sigurno šaljite tabove između svojih uređaja i otkrijte druge funkcije privatnosti u Firefoxu. @@ -397,8 +376,6 @@ Izaberi jedno - Upravljajte prečicama za pretraživanje - Upravljajte alternativnim pretraživačima Uredi pretraživače vidljive u meniju za pretragu @@ -412,8 +389,6 @@ Pretraživači Prijedlozi od pretraživača - - Adresna traka Postavke adresne trake @@ -534,14 +509,10 @@ Međutim, takođe je moguće da je umiješan i napadač. Ako nastavite na web stranicu, ne biste trebali unositi nikakve osjetljive informacije. Ako nastavite, način rada samo za HTTPS će biti privremeno isključen za web stranicu. Pristupačnost - - Zaseban Firefox Account server Prilagođeni server Mozilla računa Zaseban Sync server - - Firefox Account/Sync server promijenjen. Ugasite aplikaciju za primjenu promjena… Mozilla račun/Sync server izmijenjen. Napuštanje aplikacije radi primjene promjena… @@ -559,8 +530,6 @@ Prijavite se da sinhronizujete tabove, oznake, lozinke i još mnogo toga. - Firefox račun - Mozilla račun Ponovo se povežite za nastavak sinhronizacije @@ -572,8 +541,6 @@ Kolekcije podataka Udaljeno debagiranje preko USB-a - - Prikaži pretraživače Prikaži prijedloge za pretraživanje @@ -702,12 +669,6 @@ Istražite dodatke - - - Dodatak nije podržan - - Dodatak je već instaliran - Dodaci su privremeno onemogućeni @@ -1579,6 +1540,8 @@ Svi kolačići (može uzrokovati probleme s web stranicama) Izolirajte kolačiće trećih strana + + Reci web stranicama da ne dijele i ne prodaju podatke Praćenje sadržaja @@ -1909,28 +1872,18 @@ Dodaj novi pretraživač Uredi pretraživač - - Dodaj - - Spasi Uredi Obriši - - Ostalo Naziv - - Naziv Naziv pretraživača URL pojma za pretraživanje - Tekst za pretragu - URL koji će se koristiti za pretraživanje Zamijenite izraz sa “%s”. Primjer:\nhttps://www.google.ba/search?q=%s @@ -2154,8 +2107,6 @@ - Provjera recenzije - Provjera recenzije Pouzdane recenzije @@ -2168,7 +2119,9 @@ Prilagođena ocjena - Nepouzdane recenzije su uklonjene + Nepouzdane recenzije su uklonjene + + Na osnovu pouzdanih recenzija Izdvajamo iz nedavnih recenzija @@ -2180,14 +2133,10 @@ slovnu ocjenu od A do F.]]> Pouzdane recenzije. Vjerujemo da su recenzije vjerovatno od stvarnih kupaca koji su ostavili iskrene, nepristrasne recenzije. - - Vjerujemo da su recenzije pouzdane. Vjerujemo da postoji mješavina pouzdanih i nepouzdanih recenzija. Nepouzdane recenzije. Vjerujemo da su recenzije vjerovatno lažne ili od pristrasnih recenzenata. - - Vjerujemo da su recenzije nepouzdane. Prilagođena ocjena zasniva se samo na recenzijama za koje vjerujemo da su pouzdane.]]> @@ -2205,8 +2154,6 @@ Prikaži oglase u provjeri recenzije - Povremeno ćete vidjeti oglase za relevantne proizvode. Svi oglasi moraju zadovoljiti naše standarde kvaliteta recenzije. %s - Povremeno ćete vidjeti oglase za relevantne proizvode. Oglašavamo samo proizvode sa pouzdanim recenzijama. %s Saznajte više @@ -2230,23 +2177,23 @@ Kada ovaj proizvod bude imao više recenzija, moći ćemo provjeriti njihov kvalitet. - Proizvod nije dostupan + Proizvod nije dostupan - Ako vidite da je ovaj proizvod ponovo na zalihama, prijavite ga i mi ćemo raditi na provjeri recenzija. - - Prijavite ovaj proizvod kada bude ponovo na zalihama + Ako vidite da je ovaj proizvod ponovo na zalihama, prijavite ga i mi ćemo raditi na provjeri recenzija. - Prijavite proizvod je na zalihama + Prijavite proizvod je na zalihama - Provjera kvaliteta recenzije + Provjera kvaliteta recenzije - Provjera kvaliteta recenzije + Provjera kvaliteta recenzije + + Provjera kvaliteta recenzije (%s) Ovo bi moglo potrajati oko 60 sekundi. - Hvala na prijavi! + Hvala na prijavi! - Trebali bismo imati informacije o recenzijama ovog proizvoda u roku od 24 sata. Provjerite ponovo. + Trebali bismo imati informacije o recenzijama ovog proizvoda u roku od 24 sata. Provjerite ponovo. Ne možemo provjeriti ove recenzije @@ -2330,6 +2277,9 @@ Konkurentnost + + “%s” + sažmi @@ -2347,4 +2297,172 @@ otvorite link da saznate više %s, naslov + + + + + + Prevesti ovu stranicu? + + Isprobajte privatne prijevode na %1$s + + Radi vaše privatnosti, prijevodi nikada ne napuštaju vaš uređaj. Novi jezici i poboljšanja uskoro! %1$s + + Saznajte više + + Prevedi sa + + Prevedi na + + Ne sada + + Prevedi + + Prevođenje + + Prevođenje u toku + + + + Opcije prevođenja + + Uvijek ponudite prijevod + + Uvijek prevodi %1$s + + Nikada ne prevodi %1$s + + Nikad ne prevodi ovu stranicu + + Postavke prijevoda + + O prijevodima u %1$su + + + + Prijevodi + + Ponudi prijevod kada je to moguće + + Uvijek preuzimajte jezike u načinu rada za uštedu podataka + + Postavke prevođenja + + Automatski prijevod + + Nikada nemoj prevoditi ove stranice + + Preuzmi jezike + + + + Automatski prijevod + + + Odaberite jezik za upravljanje postavkama ”uvijek prevodi“ i ”nikad ne prevodi“. + + + + Ponudi prijevod (zadano) + + %1$s će ponuditi prevođenje web stranica na ovom jeziku. + + Uvijek prevodi + + %1$s će automatski prevesti ovaj jezik kada se stranica učita. + + Nikad ne prevodi + + %1$s nikada neće ponuditi prevođenje web stranica na ovom jeziku. + + + + Nikada nemoj prevoditi ove stranice + + Da biste dodali novu web stranicu: Posjetite stranicu i izaberite “Nikad ne prevodi ovu stranicu” iz menija za prevođenje. + + Ukloni %1$s + + Obrisati %1$s? + + Izbriši + + Otkaži + + + + Preuzmi jezike + + Preuzmite kompletne jezike za brže prijevode i prevođenje van mreže. %1$s + + Saznajte više + + Dostupni jezici + + zahtijevano + + %1$s (%2$s) + + Preuzmi jezike + + Svi jezici + + Izbriši + + U procesu + + Preuzmi + + Izabrano + + + Izbrisati %1$s (%2$s)? + + Ako izbrišete ovaj jezik, %1$s će preuzeti djelimične jezike u vašu keš memoriju dok budete prevodili. + + Izbrisati sve jezike (%1$s)? + + Ako izbrišete sve jezike, %1$s će preuzeti djelimične jezike u vašu keš memoriju dok prevodite. + + Izbriši + + Otkaži + + + Preuzeti dok ste u načinu rada za uštedu podataka (%1$s)? + + Mi preuzimamo djelimične jezike u vašu keš memoriju kako bi prijevodi bili privatni. + + Uvijek preuzimaj u režimu za uštedu podataka + + Preuzmi + + Preuzmi i prevedi + + Otkaži + + + + Tab alati + + Broj tabova + + Aktivno + + Neaktivno + + Privatno + + Ukupno diff --git a/app/src/main/res/values-cak/strings.xml b/app/src/main/res/values-cak/strings.xml index bcf9f28fb261..7b77ffa093a3 100644 --- a/app/src/main/res/values-cak/strings.xml +++ b/app/src/main/res/values-cak/strings.xml @@ -71,11 +71,6 @@ Man taya\' kan awetal pa re okisaxel re\' - - %1$s yeruyüj ri taq acookie, natab\'äl chuqa\' taq rutzij ruxaq k\'amaya\'l toq ye\'atz\'apij ronojel ri ichinan taq atzuwäch. %2$s Tikanöx pa ruxaq + + Titzalq\'omïx ruxaq Tiyak pa mol @@ -335,15 +332,10 @@ Wakami mani - - Tab\'ana\' chi ri Firefox tok jeb\'ël awokik\'amaya\'l - Niqa chi qawäch chi atqajikib\'an - - Firefox nuya\' kiq\'ij ri winaqi\' chuwäch ri ch\'akoj chuqa\' nuchajij ri awichinanem rik\'in yeruq\'ät ri taq ojqanela\' chi kikojol taq ruxaq k\'amaya\'l.\n\nCh\'aqa\' chik taq rutzijol pa ri rutzijol ichinanem. + + Ri qokik\'amaya\'l majun ch\'akoj rojqan, yatruto\' chi ri ajk\'ayij taq moloj yatkitzeqelb\'ej pa ewan pa ajk\'amaya\'l.\n\nCh\'aqa\' chik taq na\'oj pa ri rutzijol ichinanem. ichinan na\'oj @@ -352,17 +344,10 @@ Wakami mani - - Tajala\' awoyonib\'al rik\'in akematz\'ib\' o pa k\'exoj - - Ke\'akolo\' ri taq ruwi\' o ewan taq tzij pa ri ch\'aqa\' chik taq awokisaxel richin nasamajij chik el akuchi\' xakanäj kan. Titikirisäx molojri\'ïl Wakami mani - - Ri taq rutzijol yatkito\' richin nasamajij ch\'aqa\' chik pa Firefox Ri taq rutzijol yatkito\' yalan at jikil pa Firefox @@ -402,8 +387,6 @@ Tacha\' jun - Ke\'asamajij taq ruq\'a\' kanoxïk - Ke\'asamajij cha\'el taq kanob\'äl Kenuk\' tz\'etel taq kanob\'äl pa ruch\'a\'on samaj kanob\'äl @@ -417,8 +400,6 @@ Ttaq kanob\'äl Chilab\'en taq kanob\'äl - - Kikajtz\'ik Ochochib\'äl Kajowab\'al kikajtz\'ik ochochib\'äl @@ -499,6 +480,8 @@ %1$s xkeruyüj ri taq rukuki re ruxaq chuqa\' xtuk\'ëx re ruxaq. Xkeruyüj ronojel ri taq kuki, nitikïr nutz\'apij ri molojri\'ïl o yerujäm ri taq ruch\'ich\' loq\'oj. %1$s nitikïr nutojtob\'ej yeruxutuj pa ruyonil ronojel ri kik\'utuxik taq kuki pa koch\'el taq ruxaq. + + Toq nitzij, ri %1$s xtutojtob\'ej xkeruxutuj pa ruyonil ri taq kitzijol taq cookie pa re ruxaq re\'. ¿La niya\' q\'ij chi %1$s yeruxutuj ri kik\'utuxik taq kuki? @@ -534,12 +517,12 @@ Rik\'in jub\'a\' chi ri ajk\'amaya\'l ruxaq xa man nuk\'äm ta ri\' rik\'in ri HTTPS. Okel - - Ichinan ruk\'u\'x rusamaj Firefox Account + + Ichinan ruk\'u\'x rusamaj Mozilla account Ichinan ruk\'u\'x rusamaj Sync - - Xjal ruk\'u\'x kisamaj Firefox Account/Sync. Nitz\'apïx chokoy richin yesamajïx ri taq jaloj… + + Xjal ruk\'u\'x kisamaj Mozilla Account/Sync. Nitz\'apïx chokoy richin yesamajïx ri taq jaloj… Rub\'i\' taqoya\'l @@ -554,8 +537,6 @@ Tichinäx Tatikirisaj molojri\'ïl richin ye\'axïm taq ruwi\', taq yaketal, ewan tzij chuqa\' juley chik. - - Firefox Taqoya\'l Rub\'i\' rutaqoya\'l Mozilla @@ -569,8 +550,6 @@ Rucha\'ik tzij Näj chojmirisanem pa USB - - Tik\'ut kanob\'äl Kek\'ut pe ri taq chilab\'enïk richin yakanon @@ -617,6 +596,8 @@ Taq tz’aqat + + Tiyak ri tz\'aqat rik\'in ri yakb\'äl Taq rutzijol @@ -677,6 +658,10 @@ Tetamäx ch\'aqa\' chik Ojer %s + + Ri Jamäl ch\'ab\'äl molb\'äl. %s + + Ri Jamäl Ch\'ab\'äl molb\'äl. %s Tatojtob\'ej jun rub\'onil pa rub\'eyal @@ -693,12 +678,6 @@ Kenik\'öx taq tz\'aqat - - - Man nuk\'äm ta ri\' ri tz\'aqat - - Xyak ri tz\'aqat - Echupun jumej ri taq tz\'aqat @@ -1530,6 +1509,8 @@ Runuk\'ulem Ojqanem Utzirisan Chajinïk chuwäch Ojqanem + + %s yaruchajij chi kiwäch relik ojqanela\', ri nikoqaj ri nab\'än pa k\'amab\'ey. Tetamäx ch\'aqa\' chik @@ -1730,6 +1711,8 @@ Tijosq\'ïx rub\'i\' winäq + + Tijosq\'ïx ruk\'u\'x samaj Tijaq ruxaq pan okik\'amaya\'l @@ -1888,29 +1871,18 @@ Titz\'aqatiäx k\'ak\'a\' kanob\'äl Tinuk\' kanob\'äl - - Titz\'aqatisäx - - Tiyak Tinuk\' Tiyuj - - Juley chik - B\'i\'aj - - B\'i\'aj Rub\'i\' ri kanob\'äl Cholajem rukanoxik URL - Rucholajil kanoxïk nokisäx - URL xtokisäx richin ri kanoxïk Tik\'ex k\'ulb\'enïk rik\'in “%s”. @@ -2112,8 +2084,6 @@ Achi\'el: \nhttps://www.google.com/search?q=%s - Jikib\'anel taq nik\'oj - Jikib\'anel taq Nik\'oj Tawetamaj ch\'aqa\' chik pa ruwi\' %s. @@ -2129,15 +2099,15 @@ Achi\'el: \nhttps://www.google.com/search?q=%s Tijikib\'äx wakami - ¡Matyox ruma xatäq rutzijol! + ¡Matyox ruma xatäq rutzijol! Xik\'o pa nuwi\' Tetamäx ch\'aqa\' chik - ichinan na\'oj + ichinan na\'oj - Ichinan na\'oj + Ichinan na\'oj Wakami mani @@ -2160,4 +2130,7 @@ Achi\'el: \nhttps://www.google.com/search?q=%s tirik\' nimirisan + + + diff --git a/app/src/main/res/values-co/strings.xml b/app/src/main/res/values-co/strings.xml index 51c1bda477f0..692b09b2642a 100644 --- a/app/src/main/res/values-co/strings.xml +++ b/app/src/main/res/values-co/strings.xml @@ -72,11 +72,6 @@ Ùn lascià alcuna traccia nant’à st’apparechju - - %1$s squassa i vostri canistrelli, cronolugia è dati di siti quandu vo chjudite tutte e vostre finestre private. %2$s Circà in a pagina + + Traduce a pagina Arregistrà in una cullezzione @@ -334,14 +331,8 @@ Micca subitu - - Impiegate Firefox cum’è navigatore predefinitu A vostra prutezzione cunta per noi - - Firefox fà passà a ghjente nanzu à i prufiti è prutege a vostra vita privata blucchendu l’elementi intersiti di spiunagiu.\n\nSapene di più in a nostra dichjarazione di cunfidenzialità. U nostru navigatore sustinutu da un urganismu senza scopu lucrativu impedisce l’imprese di seguitavvi da manera sicreta nant’à u Web.\n\nSapene di più in a nostra dichjarazione di cunfidenzialità. Micca subitu - Passate da u telefonu à l’urdinatore purtavule è vice versa - Prutigitevi grazia à a cifratura quandu vo passate da un apparechju à l’altru - - Ricuperate l’unghjette è e parolle d’intesa da i vostri altri apparechji per rivene induve vo l’avete lasciatu. Quandu site cunnessi cù a sincrunizazione attivata, a vostra sicurità hè rinfurzata. Firefox cifra e vostre parolle d’intesa, e vostre indette, è ancu di più. @@ -365,15 +352,9 @@ Cunnettesi Micca subitu - - E nutificazioni vi aiutanu à fane di più cù Firefox E nutificazioni vi aiutanu à stà in sicurità cù Firefox - - Mandate l’unghjette trà i vostri apparechji, urganizate i scaricamenti è ricivete cunsiglii per sapè cumu ottene u più bonu di Firefox. Mandate in sicurità l’unghjette trà i vostri apparechji è scuprite d’altre funzioni di cunfidenzialità di Firefox. @@ -415,8 +396,6 @@ Selezziunà una trà l’ozzioni. - Urganizà l’accurtatoghji di ricerca - Ghjestione di l’altri mutori di ricerca Mudificà i mutori chì sò videvule in u listinu di ricerca @@ -430,8 +409,6 @@ Mutori di ricerca Suggestioni di i mutori di ricerca - - Barra d’indirizzu Preferenze per a barra d’indirizzu @@ -556,14 +533,10 @@ Sarrimanenti, si pò dinù ch’ellu s’agisce d’un attaccu. S’è vò cuntinuate versu stu situ web, ùn duveria micca stampittà alcunu datu sensibile. S’è vò cuntinuate, u modu solu HTTPS serà timpurariamente disattivatu per stu situ. Accessibilità - - Servitore persunalizatu di contu Firefox Servitore persunalizatu di contu Mozilla Servitore persunalizatu di sincrunizazione - - Mudificazione di u servitore di contu o di sincrunizazione. Chjusura di l’appiecazione per piglià i cambiamenti in contu… Servitore di contu o di sincrunizazione Mozilla mudificatu. Chjusura di l’appiecazione per piglià i cambiamenti in contu… @@ -581,8 +554,6 @@ Cunnittitevi per sincrunizà unghjette, indette, parolle d’intesa è ancu di più - Contu Firefox - Contu Mozilla Ricunnittitevi per cuntinuà a sincrunizazione @@ -594,8 +565,6 @@ Culletta di dati Spannatura alluntanata via USB - - Affissà i mutori di ricerca Affissà e suggestioni di ricerca @@ -731,12 +700,6 @@ Esplurà i moduli addiziunali - - - Stu modulu addiziunale ùn hè micca accettatu - - Stu modulu addiziunale hè dighjà installatu - I moduli addiziunali sò disattivati timpurariamente @@ -1377,6 +1340,12 @@ Chjode l’unghjette private + + + Chjode l’unghjette private ? + + Picchichjate o spazzate sta nutificazione per chjode l’unghjette private. + Marketing @@ -1611,6 +1580,8 @@ Tutti i canistrelli (impediscerà siti web di funziunà) Scartà i canistrelli intersiti + + Dì à i siti web d’ùn sparte è d’ùn vende i mo dati Cuntenutu impiegatu per u spiunagiu @@ -1659,7 +1630,7 @@ A prutezzione rinfurzata contr’à u spiunagiu hè disattivata per sti siti web - Precedente + Navigazione in daretu Ciò chì hè novu in %s Mudificà u mutore di ricerca - - Aghjunghje - - Arregistrà Mudificà Squassà - - Altru Nome - - Nome Nome di u mutore di ricerca Indirizzu web di a catena di ricerca - Catena di ricerca à impiegà - Indirizzu web à impiegà per a ricerca Rimpiazzà i termi di a ricerca da « %s ». Esempiu :\nhttps://www.google.com/search?q=%s @@ -2206,8 +2167,6 @@ - Verificadore d’avisu - Verificadore d’avisu Avisi degni di cunfidenza @@ -2221,7 +2180,9 @@ Valutazione rettificata - Avisi micca degni di cunfidenza cacciati + Avisi micca degni di cunfidenza cacciati + + Nant’à a basa d’avisi degni di cunfidenza Messe in lume da l’avisi recente @@ -2235,14 +2196,10 @@ Avisi degni di cunfidenza. Pensemu chì l’avisi venenu sicuramente da clienti veri chì anu lasciatu avisi sinceri è imparziali. - - Pensemu chì l’avisi sò di cunfidenza. Pensemu chì ci hè un mischju d’avisi più o menu degni di cunfidenza. Avisi micca degni di cunfidenza. Pensemu chì l’avisi sò sicuramente falsi o ch’elli venenu da persone partigiane. - - Pensemu chì l’avisi ùn sò micca di cunfidenza. valutazione rettificata si basa solu nant’à l’avisi chì no pensemu degni di cunfidenza.]]> @@ -2259,8 +2216,6 @@ Affissà publicità in u verificadore d’avisu - - Viderete, di quandu in quandu, una publicità per un pruduttu pertinente. Tutte ste publicità devenu risponde à e norme di qualità per l’avisi. %s Viderete, di quandu in quandu, una publicità per un pruduttu pertinente. Femu a publicità per i prudutti solu quandu i so avisi sò di cunfidenza. %s @@ -2285,23 +2240,23 @@ Quandu stu pruduttu averà d’altri avisi, puderemu cuntrollà a so qualità. - U pruduttu ùn hè micca dispunibule + U pruduttu ùn hè micca dispunibule - S’è vo fighjate chì stu pruduttu hè torna dispunibule, fatecilu sapè è cuntinueremu à cuntrollà l’avisi. + S’è vo fighjate chì stu pruduttu hè torna dispunibule, fatecilu sapè è cuntinueremu à cuntrollà l’avisi. - Fà sapè chì stu pruduttu hè torna dispunibule - - Signalà chì u pruduttu hè dispunibule + Signalà chì u pruduttu hè dispunibule - Cuntrollà a qualità di l’avisi + Cuntrollà a qualità di l’avisi - Cuntrollà a qualità di l’avisi + Cuntrollà a qualità di l’avisi + + Cuntrollu di a qualità di l’avisi (%s) St’operazione pò piglià 60 seconde - Vi ringraziemu di u vostru signalamentu ! + Vi ringraziemu di u vostru signalamentu ! - Duveriamu avè l’infurmazioni nant’à l’avisi di stu pruduttu da quì à 24 ore. Ci vole à verificà dopu. + Duveriamu avè l’infurmazioni nant’à l’avisi di stu pruduttu da quì à 24 ore. Ci vole à verificà dopu. Ùn pudemu micca cuntrollà st’avisi @@ -2339,17 +2294,17 @@ Sapene di più - A selezzione di « Sì, pruvallu » vole dì chì vo site d.accunsenti cù %2$s è %3$s di %1$s da Mozilla. + A selezzione di « Sì, pruvallu » vole dì chì vo site d.accunsenti cù %2$s è %3$s di %1$s da Mozilla. - A selezzione di « Sì, pruvallu » vole dì chì vo accettate quell’elementi di %1$s : + A selezzione di « Sì, pruvallu » vole dì chì vo accettate quell’elementi di %1$s : - pulitica di cunfidenzialità + pulitica di cunfidenzialità - Pulitica di cunfidenzialità + Pulitica di cunfidenzialità - cundizioni d’utilizazione + cundizioni d’utilizazione - Cundizioni d’utilizazione + Cundizioni d’utilizazione Sì, pruvallu @@ -2387,6 +2342,9 @@ Cumpetitività + + « %s » + riduce @@ -2404,4 +2362,209 @@ apre u liame per sapene di più %s, Titulu + + + Liami + + Liami dispunibule + + + + + + Traduce sta pagina ? + + Pruvà e traduzzioni private di %1$s + + + Per rispettà a vostra vita privata, e traduzzioni ùn escenu mai da u vostru apparechju. Lingue nove è altri amendamenti seranu dispunibule prestu ! %1$s + + Sapene di più + + Traduce da + + Traduce versu + + Micca subitu + + Compiu + + Traduce + + Pruvà torna + + Traduzzione + + Traduzzione in corsu + + + Un prublema hè accadutu durante a traduzzione. Ci vole à pruvà torna. + + Ùn si pò micca caricà e lingue. Ci vole à verificà a vostra cunnessione internet è pruvà torna. + + Per disgrazia, a lingua %1$s ùn hè ancu accettata. + + Sapene di più + + + + Ozzioni di traduzzione + + Prupone sempre di traduce + + Traduce sempre in %1$s + + Ùn traduce mai in %1$s + + Ùn traduce mai stu situ + + Preferenze di traduzzione + + + Apprupositu di e traduzzioni in %1$s + + + + Traduzzioni + + Prupone di traduce quand’ella hè pussibule + + Scaricà sempre e lingue in modu di risparmiu di dati + + Preferenze di traduzzione + + Traduzzione autumatica + + Ùn traduce mai sti siti + + Scaricà lingue + + + + Traduzzione autumatica + + + Selezziunà una lingua per sceglie l’ozzione « Traduce sempre » o « Ùn traduce mai ». + + + + Prupone di traduce (predefinitu) + + %1$s pruponerà di traduce i siti in sta lingua. + + Traduce sempre + + %1$s traducerà autumaticamente sta lingua à u caricamentu di a pagina. + + + Ùn traduce mai + + %1$s ùn pruponerà mai di traduce i siti in sta lingua. + + + + Ùn traduce mai sti siti + + Per aghjunghje un situ novu : visitatelu è selezziunate « Ùn traduce mai stu situ » da u listinu di traduzzione. + + Caccià %1$s + + Squassà %1$s ? + + Squassà + + Abbandunà + + + + Scaricà lingue + + Scaricate e lingue sane per traduce più prestu è senza cunnessione internet. %1$s + + Sapene di più + + Lingue dispunibule + + richiestu + + + %1$s (%2$s) + + Scaricà lingue + + Tutte e lingue + + Squassà + + In corsu + + Scaricà + + Selezziunata + + + Squassà %1$s (%2$s) ? + + + S’è vo squassate sta lingua, %1$s scaricherà in l’impiatta certe parti di lingue à pocu à pocu di e traduzzioni. + + Squassà tutte e lingue (%1$s) ? + + S’è vo squassate tutte e lingue, %1$s scaricherà in l’impiatta certe parti di lingue à pocu à pocu di e traduzzioni. + + Squassà + + Abbandunà + + + Scaricà in modu di risparmiu di dati (%1$s) ? + + Scarichemu in a vostra impiatta certe parti di lingue per mantene private e vostre traduzzioni. + + Scaricà sempre in modu di risparmiu di dati + + Scaricà + + Scaricà è traduce + + Abbandunà + + + + Attrezzi di spannatura + + Navigazione in daretu + + Attrezzi d’unghjette + + Numeru d’unghjette + + Attive + + Inattive + + Private + + Tutale + + Attrezzu di creazione d’unghjetta + + Numeru d’unghjette à creà + + Aghjunghje à l’unghjette attive + + Aghjunghje à l’unghjette inattive + + Aghjunghje à l’unghjette private diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 7bb530bb55ba..e751c19c3657 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -71,11 +71,6 @@ Nezanechávejte na tomto zařízení žádné stopy - - Když zavřete všechna anonymní okna, %1$s odstraní vaše soubory cookie, historii a data stránek. %2$s Najít na stránce + + Přeložit stránku Uložit do sbírky @@ -336,14 +333,8 @@ Teď ne - - Používejte Firefox jako svůj hlavní prohlížeč Rádi vás udržujeme v bezpečí - - Firefox upřednostňuje lidi před ziskem a chrání vaše soukromí blokováním cross-site sledovacích prvků.\n\nZjistěte více v našich zásadách ochrany osobních údajů. Náš neziskový prohlížeč pomáhá zabránit společnostem v tajném sledování vašeho prohlížení webu.\n\nZjistěte více v našich zásadách ochrany osobních údajů. Teď ne - Přeskočte z telefonu na notebook a zpět - Při přecházení mezi zařízeními buďte šifrovaní - - Získejte panely a hesla z ostatních zařízení a pokračujte tam, kde jste skončili. Když jste přihlášeni a synchronizujete, jste ve větším bezpečí. Firefox šifruje vaše hesla, záložky a další data. @@ -366,15 +353,9 @@ Přihlásit se Teď ne - - Oznámení vám pomohou s Firefoxem udělat více Oznámení vám pomáhají zůstat s Firefoxem ve větším bezpečí - - Posílejte si panely mezi zařízeními, spravujte stahování a získejte tipy, jak co nejlépe Firefox využít. Posílejte si panely mezi svými zařízeními bezpečně a objevte další funkce Firefoxu pro ochranu soukromí. @@ -416,8 +397,6 @@ Zvolte nějaký - Spravovat zkratky pro vyhledávání - Spravovat alternativní vyhledávací moduly Upravit vyhledávače viditelné v nabídce vyhledávání @@ -431,8 +410,6 @@ Vyhledávače Návrhy z vyhledávačů - - Adresní řádek Předvolby adresního řádku @@ -552,14 +529,10 @@ Je také možné, že v tom má prsty útočník. Pokud se rozhodnete tuto stránku navštívit, doporučujeme na ní nezadávat žádné citlivé informace. Pokud se rozhodnete pokračovat, bude pro tento server režim „pouze HTTPS“ dočasně vypnut. Přístupnost - - Vlastní server pro účet Firefoxu Vlastní server pro účet Mozilly Vlastní server pro synchronizaci - - Server pro účet Firefoxu nebo synchronizaci byl změněn. Pro aplikování změn se nyní aplikace ukončí… Server pro účet Mozilly nebo synchronizaci byl změněn. Pro aplikování změn se nyní aplikace ukončí… @@ -577,8 +550,6 @@ Pro synchronizaci svých panelů, záložek, hesel a dalších věcí se přihlaste. - Účet Firefoxu - Účet Mozilla Pro spuštění synchronizace se znovu připojte @@ -590,8 +561,6 @@ Sběr dat Vzdálené ladění pomocí USB - - Zobrazovat vyhledávače Našeptávat dotazy pro vyhledávač @@ -610,7 +579,7 @@ Nastavení účtu - Automaticky doplňovat URL adresy + Automaticky doplňovat adresy URL Návrhy od sponzorů Prozkoumejte doplňky - - - Doplněk není podporován - - Doplněk je již nainstalován - Doplňky jsou dočasně zakázány. @@ -1376,6 +1339,12 @@ Zavřít anonymní panely + + + Zavřít anonymní panely? + + Klepnutím na toto oznámení nebo jeho přejetím prstem zavřete anonymní panely. + Marketingová sdělení @@ -1615,6 +1584,8 @@ Všechny cookies (omezí fungování některých stránek) Izolovat cross-site cookies + + Požádat webové stránky, aby nesdílely a neprodávaly mé údaje Sledující obsah @@ -1955,29 +1926,19 @@ Přidat nový vyhledávač Upravit vyhledávač - - Přidat - - Uložit Upravit Odebrat - - Vlastní Název - - Název Název vyhledávače Adresa URL vyhledávače - Řetězec používaný pro vyhledávání - Adresa URL, která se má použít pro vyhledávání Dotaz nahraďte „%s“. Příklad: \nhttps://www.google.com/search?q=%s @@ -2208,8 +2169,6 @@ - Kontrola recenzí - Kontrola recenzí Spolehlivé recenze @@ -2222,7 +2181,9 @@ Upravené hodnocení - Nespolehlivé recenze odebrány + Nespolehlivé recenze odebrány + + Na základě spolehlivých recenzí Vybrané nedávné recenze @@ -2233,14 +2194,10 @@ známku písmenem od A do F.]]> Spolehlivé recenze. Věříme, že recenze pocházejí pravděpodobně od skutečných zákazníků, kteří zanechali upřímné a nezaujaté recenze. - - Věříme, že recenze jsou spolehlivé. Věříme, že je zde směs spolehlivých a nespolehlivých recenzí. Nespolehlivé recenze. Domníváme se, že tyto recenze jsou pravděpodobně falešné a nebo od zaujatých recenzentů. - - Domníváme se, že recenze jsou nespolehlivé. Upravené hodnocení je založeno pouze na recenzích, které považujeme za spolehlivé.]]> @@ -2256,8 +2213,6 @@ Zobrazovat reklamy v kontrole recenzí - Občas se vám zobrazí reklamy na příslušné produkty. Všechny reklamy musí splňovat naše standardy kvality recenzí. %s - Občas se vám zobrazí reklamy na relevantní produkty. Inzerujeme pouze produkty se spolehlivými recenzemi. %s Zjistěte více @@ -2280,23 +2235,23 @@ Až bude mít tento produkt více recenzí, budeme moci zkontrolovat jejich kvalitu. - Produkt není k dispozici + Produkt není k dispozici - Pokud zjistíte, že je tento produkt opět skladem, nahlaste to a my se pokusíme recenze zkontrolovat. + Pokud zjistíte, že je tento produkt opět skladem, nahlaste to a my se pokusíme recenze zkontrolovat. - Nahlaste, že je tento produkt opět skladem - - Oznámit, že produkt je skladem + Oznámit, že produkt je skladem - Kontroluje se kvalita recenzí + Kontroluje se kvalita recenzí - Kontroluje se kvalita recenzí + Kontroluje se kvalita recenzí + + Kontroluje se kvalita recenzí (%s) Může to trvat asi 60 sekund. - Děkujeme za nahlášení! + Děkujeme za nahlášení! - Informace o hodnocení tohoto produktu bychom měli mít k dispozici do 24 hodin. Prosím, zkontrolujte to znovu. + Informace o hodnocení tohoto produktu bychom měli mít k dispozici do 24 hodin. Prosím, zkontrolujte to znovu. Tyto recenze nemůžeme zkontrolovat @@ -2334,17 +2289,17 @@ Zjistit více - Výběrem možnosti "Ano, vyzkoušet" souhlasíte s %1$s od Mozilly %2$s a %3$s. + Výběrem možnosti "Ano, vyzkoušet" souhlasíte s %1$s od Mozilly %2$s a %3$s. - Výběrem možnosti „Ano, vyzkoušet“ souhlasíte s následujícím dokumentem od %1$s: + Výběrem možnosti „Ano, vyzkoušet“ souhlasíte s následujícím dokumentem od %1$s: - zásady ochrany osobních údajů + zásady ochrany osobních údajů - Zásady ochrany soukromí + Zásady ochrany soukromí - zásady používání + zásady používání - Podmínky použití + Podmínky použití Ano, vyzkoušet @@ -2380,6 +2335,9 @@ Konkurenceschopnost + + „%s“ + sbalit @@ -2397,4 +2355,205 @@ otevřít odkaz pro další informace %s, nadpis + + + Odkazy + + Dostupné odkazy + + + + + + Přeložit tuto stránku? + + Vyzkoušejte soukromé překlady v aplikaci %1$s + + V zájmu ochrany vašeho soukromí překlady nikdy neopouštějí vaše zařízení. Nové jazyky a vylepšení již brzy! %1$s + + Dozvědět se více + + Překlad z + + Překlad do + + Teď ne + + Hotovo + + Přeložit + + Zkusit znovu + + Probíhá překlad + + Právě probíhá překlad + + Při překladu došlo k chybě. Zkuste to prosím znovu. + + Nelze načíst jazyky. Zkontrolujte připojení k internetu a zkuste to znovu. + + Je nám líto, ale jazyk %1$s zatím není podporován. + + Zjistit více + + + + Možnosti překladu + + Vždy nabídnout překlad + + Vždy překládat jazyk %1$s + + Nikdy nepřekládat z jazyka %1$s + + Nikdy nepřekládat tuto stránku + + Nastavení překladu + + Informace o překladech v aplikaci %1$s + + + + Překlady + + Pokud je to možné, nabídnout překlad + + Jazyky vždy stahovat v úsporném režimu + + Nastavení překladu + + Automatický překlad + + Nikdy nepřekládat tyto stránky + + Stáhnout jazyky + + + + Automatický překlad + + + Vyberte jazyk, u kterého chcete spravovat předvolby „vždy překládat“ a „nikdy nepřekládat“. + + + + Nabídnout překlad (výchozí) + + %1$s nabídne překlad stránek do tohoto jazyka. + + Vždy překládat + + %1$s automaticky přeloží tento jazyk při načtení stránky. + + Nikdy nepřekládat + + + %1$s nikdy nenabídne překlad stránek v tomto jazyce. + + + + Nikdy nepřekládat tyto stránky + + Pokud chcete přidat novou stránku: navštivte ji a v nabídce překladů zvolte možnost „Nikdy nepřekládat tuto stránku“. + + Odebrat %1$s + + Smazat %1$s? + + Smazat + + Zrušit + + + + Stažení jazyků + + Stáhněte si kompletní jazyky pro rychlejší překlady a překládání offline. %1$s + + Zjistit více + + Dostupné jazyky + + vyžadováno + + %1$s (%2$s) + + Stažení jazyků + + Všechny jazyky + + Smazat + + Probíhá + + Stáhnout + + Vybráno + + + Smazat %1$s (%2$s)? + + + Pokud tento jazyk odstraníte, %1$s v průběhu překládání stáhne do mezipaměti jen část údajů pro daný jazyk. + + Smazat všechny jazyky (%1$s)? + + Pokud odstraníte všechny jazyky, %1$s bude při překladu stahovat do mezipaměti jen část údajů pro daný jazyk. + + Smazat + + Zrušit + + + Stahovat v režimu úspory dat (%1$s)? + + Částečné jazyky stahujeme do mezipaměti, aby překlady zůstaly soukromé. + + V režimu úspory dat vždy stahovat + + Stáhnout + + Stáhnout jazyk a přeložit + + Zrušit + + + + Nástroje pro ladění + + Návrat zpět + + Nástroje pro panely + + Počet panelů + + Aktivní + + Neaktivní + + Anonymní + + Celkem + + Nástroj na vytváření panelů + + Počet panelů, které chcete vytvořit + + Přidat mezi aktivní panely + + Přidat mezi neaktivní panely + + Přidat mezi anonymní panely diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index e774b3cecd45..0dc940565c33 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -69,11 +69,6 @@ Gadael dim ôl ar y ddyfais hon - - Mae %1$s yn dileu eich cwcis, hanes, a data gwefan pan fyddwch yn cau eich holl ffenestri preifat. %2$s Canfod ar y dudalen + + Cyfieithu\'r dudalen Cadw i Gasgliad @@ -328,14 +325,8 @@ Nid nawr - - Gwnewch Firefox yn borwr i chi Rydyn ni wrth ein bodd yn eich cadw chi’n ddiogel - - Mae Firefox yn rhoi pobl o flaen elw ac yn diogelu eich preifatrwydd trwy rwystro tracwyr traws-gwefan.\n\nDysgwch ragor yn ein hysbysiad preifatrwydd. Mae ein porwr gan gorff dim-er-elw yn helpu i atal cwmnïau rhag eich dilyn yn gyfrinachol o amgylch y we.\n\nDarllenwch ragor yn ein hysbysiad preifatrwydd. Nid nawr - Ewch o’r ffôn i’r gliniadur ac yn ôl - Cadwch wedi’ch amgryptio pan fyddwch chi’n symud rhwng dyfeisiau - - Cipiwch dabiau a chyfrineiriau o’ch dyfeisiau eraill i barhau lle roeddech chi gynt. Pan fyddwch chi wedi mewngofnodi ac wedi cydweddu, rydych chi’n fwy diogel. Mae Firefox yn amgryptio’ch cyfrineiriau, nodau tudalen a rhagor. @@ -358,15 +345,9 @@ Mewngofnodi Nid nawr - - Mae hysbysiadau yn eich helpu i wneud rhagor gyda Firefox Mae hysbysiadau’n eich helpu i gadw’n fwy diogel gyda Firefox - - Yn anfon tabiau rhwng dyfeisiau, rheoli llwythi, a chael awgrymiadau am sut i gael y gorau o Firefox. Anfonwch dabiau’n ddiogel rhwng eich dyfeisiau a darganfyddwch nodweddion preifatrwydd eraill yn Firefox. @@ -408,8 +389,6 @@ Dewiswch un - Rheoli llwybrau byr chwilio - Rheoli peiriannau chwilio eraill Golygu peiriannau sy’n weladwy yn y ddewislen chwilio @@ -423,8 +402,6 @@ Peiriannau chwilio Awgrymiadau o beiriannau chwilio - - Bar cyfeiriad Dewisiadau bar cyfeiriad @@ -549,14 +526,10 @@ Fodd bynnag, mae hefyd yn bosibl bod ymosodwr wrthi. Os byddwch yn parhau i’r wefan, peidiwch â rhoi unrhyw wybodaeth sensitif. Os byddwch yn parhau, bydd modd HTTPS-yn-Unig yn cael ei ddiffodd dros dro ar gyfer y wefan. Hygyrchedd - - Gweinydd Cyfrif Cyfaddas Firefox Gweinydd cyfrif Mozilla cyfaddas Gweinydd Sync Cyfaddas - - Mae Cyfrif Firefox/gweinydd Sync wedi’i addasu. Yn gadael y rhaglen i osod y newidiadau… Mae eich cyfrif Mozilla/Gweinydd Sync wedi’i addasu. Wrthi’n gadael y rhaglen er mwyn gwneud newidiadau… @@ -574,8 +547,6 @@ Mewngofnodwch i gydweddu tabiau, nodau tudalen, cyfrineiriau, a rhagor. - Cyfrif Firefox - Cyfrif Mozilla Ailgysylltu i ailddechrau cydweddu @@ -587,8 +558,6 @@ Casglu data Dadfygio pell drwy USB - - Dangos y peiriannau chwilio Dangos awgrymiadau chwilio @@ -720,12 +689,6 @@ Archwiliwch yr ychwanegion - - - Nid yw’r ychwanegyn yn cael ei gefnogi - - Mae’r ychwanegyn eisoes wedi’i osod - Mae ychwanegion wedi’u hanalluogi dros dro @@ -1361,6 +1324,11 @@ Cau tabiau preifat + + + Cau tabiau preifat? + Tapiwch neu swipe yr hysbysiad hwn i gau tabiau preifat. + Marchnata @@ -1596,6 +1564,8 @@ Pob cwci (bydd yn achosi i wefannau dorri) Ynyswch cwcis traws-wefan + + Dweud wrth wefannau i beidio â rhannu a gwerthu data Cynnwys tracio @@ -1934,28 +1904,18 @@ Ychwanegu peiriant chwilio newydd Golygu peiriant chwilio - - Ychwanegu - - Cadw Golygu Dileu - - Eraill Enw - - Enw Enw peiriant chwilio URL llinyn chwilio - Llinyn chwilio i’w ddefnyddio - URL i’w ddefnyddio i chwilio Disodli’r ymholiad â “%s”. Enghraifft:\nhttps://www.google.com/search?q=%s @@ -2185,8 +2145,6 @@ - Gwirydd adolygiadau - Gwirydd Adolygiadau Adolygiadau dibynadwy @@ -2199,7 +2157,9 @@ Gradd wedi’i haddasu - Dilëwyd yr adolygiadau annibynadwy + Dilëwyd yr adolygiadau annibynadwy + + Ar sail adolygiadau dibynadwy Uchafbwyntiau o adolygiadau diweddar @@ -2210,14 +2170,10 @@ gradd llythyren o A i F i adolygiadau pob cynnyrch.]]> Adolygiadau dibynadwy. Rydym yn credu fod yr adolygiadau’n debygol o fod gan gwsmeriaid go iawn sydd wedi gadael adolygiadau gonest, diduedd. - - Credwn fod yr adolygiadau yn ddibynadwy. Rydym yn credu fod yna gymysgedd o adolygiadau dibynadwy ac annibynadwy. Adolygiadau annibynadwy. Rydym yn credu fod yr adolygiadau yn debygol o fod yn rhai ffug neu gan adolygwyr rhagfarnllyd. - - Credwn fod yr adolygiadau’n annibynadwy. gradd wedi’i addasu yn seiliedig ar adolygiadau y credwn eu bod yn ddibynadwy yn unig.]]> @@ -2233,8 +2189,6 @@ Dangos hysbysebion yn y gwirydd adolygiadau - Fe welwch hysbysebion achlysurol ar gyfer cynnyrch perthnasol. Rhaid i bob hysbyseb fodloni ein safonau ansawdd adolygiadau. %s - Byddwch yn gweld hysbysebion achlysurol ar gyfer cynnyrch perthnasol. Dim ond cynnyrch gydag adolygiadau dibynadwy rydym yn eu hysbysebu. %s Dysgu rhagor @@ -2257,23 +2211,23 @@ Pan fydd gan y cynnyrch hwn fwy o adolygiadau, byddwn yn gallu gwirio eu hansawdd. - Nid yw’r cynnyrch ar gael + Nid yw’r cynnyrch ar gael - Os ydych yn gweld fod y cynnyrch hwn nôl mewn stoc, rhowch wybod i ni ac fe wnawn ni ddiweddaru’r dadansoddiad. + Os ydych yn gweld fod y cynnyrch hwn nôl mewn stoc, rhowch wybod i ni ac fe wnawn ni ddiweddaru’r dadansoddiad. - Adrodd fod y cynnyrch hwn nôl mewn stoc - - Adrodd fod cynnyrch mewn stoc + Adrodd fod cynnyrch mewn stoc - Yn gwirio ansawdd adolygiadau + Yn gwirio ansawdd adolygiadau - Yn gwirio ansawdd adolygiadau + Yn gwirio ansawdd adolygiadau + + Yn gwirio ansawdd adolygiadau (%s) Gall hyn gymryd tua 60 eiliad. - Diolch am adrodd! + Diolch am adrodd! - Dylai fod gennym dadansoddiad wedi’i ddiweddaru o fewn 24 awr. Dewch nôl i weld. + Dylai fod gennym dadansoddiad wedi’i ddiweddaru o fewn 24 awr. Dewch nôl i weld. Methu gwirio’r adolygiadau hyn @@ -2311,17 +2265,17 @@ Dysgu rhagor - Trwy ddewis “Iawn, rhoi cynnig arno” rydych yn cytuno i %2$s a %3$s %1$s gan Mozilla. + Trwy ddewis “Iawn, rhoi cynnig arno” rydych yn cytuno i %2$s a %3$s %1$s gan Mozilla. - Wrth ddewis “Iawn, rhowch gynnig arni” rydych yn cytuno i’r canlynol o %1$s: + Wrth ddewis “Iawn, rhowch gynnig arni” rydych yn cytuno i’r canlynol o %1$s: - polisi preifatrwydd + polisi preifatrwydd - Polisi preifatrwydd + Polisi preifatrwydd - telerau defnydd + telerau defnydd - Telerau defnydd + Telerau defnydd Iawn, rhoi cynnig arno @@ -2357,6 +2311,9 @@ Cystadleurwydd + + “%s” + cau @@ -2374,4 +2331,204 @@ agor dolen i wybod rhagor %s, Pennyn + + + Dolenni + + Dolenni ar gael + + + + + + Cyfieithu\'r dudalen? + + Rhowch gynnig ar gyfieithu preifat yn %1$s + + Er eich preifatrwydd, nid yw cyfieithiadau byth yn gadael eich dyfais. Ieithoedd newydd a gwelliannau yn dod yn fuan! %1$s + + Darllen rhagor + + Cyfieithu o\'r + + Cyfieithu i\'r + + Nid nawr + + Gorffen + + Cyfieithu + + Ceisio eto + + Yn cyfieithu + + Wrthi\'n Cyfieithu + + + Bu anhawster wrth gyfieithu. Ceisiwch eto. + + Methu llwytho ieithoedd. Gwiriwch eich cysylltiad rhyngrwyd a rhowch gynnig arall arni. + + Ymddiheuriadau, nid ydym yn cefnogi %1$s eto. + + + Dysgu rhagor + + + + Dewisiadau Cyfieithu + + Cynnig i gyfieithu bob tro + + Cyfieithu %1$s bob tro + + Peidio â chyfieithu %1$s + + Peidio â chyfieithu\'r wefan hon + + Gosodiadau cyfieithu + + Ynghylch cyfieithu yn %1$s + + + + Cyfieithu + + Cynnig i gyfieithu pan fo modd + + Llwytho ieithoedd yn y modd arbed data, bob tro + + Dewisiadau cyfieithu + + Cyfieithu awtomatig + + Peidio â chyfieithu\'r gwefannau hyn + + Llwytho ieithoedd i lawr + + + + Cyfieithu awtomatig + + Dewiswch iaith i reoli dewisiadau ”cyfieithu bob tro“ a ”peidio â chyfieithu“. + + + + Cynnig i gyfieithu (rhagosodedig) + + Bydd %1$s yn cynnig cyfieithu gwefannau yn yr iaith hon. + + Cyfieithu bob tro + + Bydd %1$s yn cyfieithu\'r iaith hon yn awtomatig pan fydd y dudalen yn llwytho. + + Byth cyfieithu + + Fydd %1$s byth yn cynnig cyfieithu gwefannau yn yr iaith hon. + + + + Peidio byth â chyfieithu\'r gwefannau hyn + + I ychwanegu gwefan newydd: Ewch yno a dewis “Peidio byth â chyfieithu\'r wefan hon” o\'r ddewislen cyfieithu. + + Tynnu %1$s + + Dileu %1$s? + + Dileu + + Diddymu + + + + Llwytho Ieithoedd i Lawr + + Llwytho ieithoedd cyfan i lawr ar gyfer cyfieithiadau cyflymach ac i gyfieithu all-lein. %1$s + + Darllen rhagor + + Ieithoedd ar gael + + angenrheidiol + + %1$s (%2$s) + + Llwytho Ieithoedd i Lawr + + Pob iaith + + Dileu + + Ar waith + + Llwytho i Lawr + + Dewiswyd + + + Dileu %1$s (%2$s)? + + Os byddwch yn dileu\'r iaith hon, bydd %1$s yn llwytho ieithoedd rhannol i\'ch storfa wrth i chi gyfieithu. + + Dileu pob iaith (%1$s)? + + Os byddwch yn dileu pob iaith, bydd %1$s yn llwytho ieithoedd rhannol i\'ch storfa wrth i chi gyfieithu. + + Dileu + + Diddymu + + + Llwytho i lawr tra yn y modd cadw data (%1$s)? + + Rydym yn llwytho ieithoedd rhannol i\'ch storfa i gadw cyfieithiadau\'n breifat. + + Llwytho i lawr yn y modd arbed data, bob tro + + Llwytho i Lawr + + Llwytho i lawr a chyfieithu + + Diddymu + + + + Offer Dadfygio + + Symud nôl + + Offer Tab + + Cyfrif tab + + Gweithredol + + Anweithredol + + Preifat + + Cyfanswm + + Teclyn creu tabiau + + Nifer y tabiau i\'w creu + + Ychwanegu at y tabiau gweithredol + + Ychwanegu at dabiau anweithredol + + Ychwanegu at y tabiau preifat diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index a3318a8f99cf..ce2a3d50defd 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -68,11 +68,6 @@ Efterlad ingen spor på denne enhed - - %1$s sletter din historik samt dine cookies og websteds-data, når du lukker alle dine private vinduer. %2$s - - Gør Firefox til din standard-browser Vi elsker at holde dig sikker - - Firefox sætter mennesker før profit og beskytter dit privatliv ved at blokere sporing på tværs af websteder.\n\nLæs mere i vores privatlivserklæring. Vores non-profit-støttede browser hjælper med at forhindre virksomheder i at følge dig rundt på nettet i hemmelighed.\n\nLæs mere i vores privatlivserklæring. Ikke nu - Fra telefon til computer og tilbage - Krypter dine data, når du skifter mellem enheder - - Hent faneblade og adgangskoder fra dine andre enheder for at fortsætte, hvor du slap. Du er mere sikker, når du er logget ind og har synkroniseret dine data. Firefox krypterer dine adgangskoder, bogmærker med mere. @@ -359,15 +344,9 @@ Log ind Ikke nu - - Meddelelser hjælper dig med at gøre mere med Firefox Meddelelser gør dig mere sikker, når du bruger Firefox - - Send faneblade mellem enheder, håndter filhentninger og få tips til at få mest muligt ud af Firefox. Send sikkert faneblade mellem dine enheder, og opdag andre privatlivsfunktioner i Firefox. @@ -409,8 +388,6 @@ Vælg en - Håndter søgegenveje - Håndter alternative søgetjenester Rediger tjenester, der er synlige i søgemenuen @@ -424,8 +401,6 @@ Søgetjenester Forslag fra søgetjenester - - Adressefelt Indstillinger for adressefelt @@ -549,14 +524,10 @@ Det er også muligt, at en ondsindet aktør er involveret. Hvis du fortsætter til webstedet, bør du ikke afgive nogen følsomme oplysninger. Hvis du fortsætter, vil kun-HTTPS blive slået midlertidigt fra for dette websted. Tilgængelighed - - Selvvalgt Firefox-kontoserver Selvvalgt Mozilla-kontoserver Selvvalgt synkroniseringsserver - - Firefox-konto/Sync-server ændret. Afslutter applikationen for at anvende ændringerne… Mozilla-konto/Sync-server ændret. Afslutter applikationen for at anvende ændringerne… @@ -574,8 +545,6 @@ Log ind for at synkronisere dine faneblade, bogmærker, adgangskoder med mere. - Firefox-konto - Mozilla-konto Opret forbindelse igen for at fortsætte synkronisering @@ -587,8 +556,6 @@ Indsamling af data Fjern-debugging via USB - - Vis søgetjenester Vis søgeforslag @@ -718,12 +685,6 @@ Udforsk tilføjelser - - - Tilføjelsen understøttes ikke - - Tilføjelsen er allerede installeret - Tilføjelser er midlertidigt deaktiveret @@ -1589,6 +1550,8 @@ Alle cookies (vil forhindre websteder i at fungere) Isoler cookies på tværs af websteder + + Fortæl websteder, at de ikke skal dele og sælge data Sporings-indhold @@ -1925,28 +1888,18 @@ Tilføj ny søgetjeneste Rediger søgetjeneste - - Tilføj - - Gem Rediger Slet - - Andre Navn - - Navn Søgetjenestens navn Søgestrengs-URL - Søgestreng der skal anvendes - URL til brug for søgning Erstat forespørgslen med “%s”. Eksempel:\nhttps://www.google.com/search?q=%s @@ -2174,8 +2127,6 @@ - Verificering af anmeldelser - Verificering af anmeldelser Pålidelige anmeldelser @@ -2188,7 +2139,9 @@ Justeret bedømmelse - Upålidelige anmeldelser er blevet fjernet + Upålidelige anmeldelser er blevet fjernet + + Baseret på pålidelige anmeldelser Højdepunkter fra de seneste anmeldelser @@ -2200,14 +2153,10 @@ karakter fra A til F.]]> Pålidelige anmeldelser. Vi vurderer, at anmeldelserne sandsynligvis stammer fra rigtige kunder, der har givet ærlige og upartiske anmeldelser. - - Vi vurderer, at anmeldelserne er pålidelige. Vi vurderer, at der findes en blanding af pålidelige og upålidelige anmeldelser. Upålidelige anmeldelser. Vi vurderer, at anmeldelserne sandsynligvis er forfalskede eller stammer fra partiske anmeldere. - - Vi vurderer, at anmeldelserne er upålidelige. justerede bedømmelse er udelukkende baseret på anmeldelser, som vi vurderer er pålidelige.]]> @@ -2223,8 +2172,6 @@ Vis reklamer i verificering af anmeldelser - Du vil til tider få vist reklamer for relevante produkter. Alle reklamer skal overholde vores standarder for anmeldelses-kvalitet. %s - Du vil til tider få vist reklamer for relevante produkter. Vi reklamerer kun for produkter med pålidelige anmeldelser. %s @@ -2248,23 +2195,23 @@ Når dette produkt har flere anmeldelser, kan vi kontrollere kvaliteten af dem. - Produktet er ikke tilgængeligt + Produktet er ikke tilgængeligt - Hvis du lægger mærke til at produktet er på lager igen, må du gerne rapportere det. Så kan vi kontrollere anmeldelserne. - - Rapporter at produktet er på lager igen + Hvis du lægger mærke til at produktet er på lager igen, må du gerne rapportere det. Så kan vi kontrollere anmeldelserne. - Rapporter at produktet er på lager + Rapporter at produktet er på lager - Kontrollerer kvaliteten af anmeldelser + Kontrollerer kvaliteten af anmeldelser - Kontrollerer kvaliteten af anmeldelser + Kontrollerer kvaliteten af anmeldelser + + Kontrollerer kvaliteten af anmeldelser (%s) Dette kan tage cirka 60 sekunder. - Tak for hjælpen! + Tak for hjælpen! - Vi burde have oplysninger om dette produkts anmeldelser klar indenfor 24 timer. Tjek igen senere. + Vi burde have oplysninger om dette produkts anmeldelser klar indenfor 24 timer. Tjek igen senere. Vi kan ikke kontrollere disse anmeldelser @@ -2349,6 +2296,9 @@ Konkurrencedygtighed + + "%s" + folde sammen @@ -2366,4 +2316,174 @@ åbne link for at læse mere %s, overskrift + + + + + + Oversæt siden? + + Prøv private oversættelser i %1$s + + For at beskytte dit privatliv forlader oversættelserne aldrig din enhed. Nye sprog og andre forbedringer kommer snart! %1$s + + Læs mere + + Oversæt fra + + Oversæt til + + Ikke nu + + Oversæt + + Oversætter + + Oversættelse i gang + + + + Oversættelses-indstillinger + + Tilbyd altid at oversætte + + Oversæt altid %1$s + + Oversæt aldrig %1$s + + Oversæt aldrig dette websted + + Oversættelses-indstillinger + + Om oversættelser i %1$s + + + + Oversættelser + + Tilbyd at oversætte, når det er muligt + + Hent altid sprog i datasparer-tilstand + + Indstillinger for oversættelse + + Automatisk oversættelse + + Oversæt aldrig disse websteder + + Hent sprog + + + + Automatisk oversættelse + + Vælg et sprog for at håndtere indstillingerne "oversæt altid" og "oversæt aldrig". + + + + Tilbyd at oversætte (standard) + + %1$s vil tilbyde at oversætte websteder på dette sprog. + + Oversæt altid + + %1$s vil automatisk oversætte dette sprog, når siden indlæses. + + Oversæt aldrig + + + %1$s vil aldrig tilbyde at oversætte websteder på dette sprog. + + + + Oversæt aldrig disse websteder + + For at tilføje et nyt websted: Besøg webstedet og vælg "Oversæt aldrig dette websted" fra oversættelsesmenuen. + + Fjern %1$s + + Slet %1$s? + + Slet + + Annuller + + + + Hent sprog + + Hent komplette sprog for hurtigere oversættelser og for at oversætte offline. %1$s + + Læs mere + + Tilgængelige sprog + + påkrævet + + + %1$s (%2$s) + + Hent sprog + + Alle sprog + + Slet + + I gang + + Hent + + Valgt + + + Slet %1$s (%2$s)? + + Hvis du sletter dette sprog, vil %1$s delvist hente sprog til din cache, mens du oversætter. + + Slet alle sprog (%1$s)? + + + Hvis du sletter alle sprog, vil %1$s delvist hente sprog til din cache, mens du oversætter. + + Slet + + Annuller + + + Hent i datasparer-tilstand (%1$s)? + + Vi henter sprog delvist til din cache for at holde oversættelser private. + + Hent altid i datasparer-tilstand + + Hent + + Hent og oversæt + + Annuller + + + + Fanebladsværktøjer + + Antal faneblade + + Aktive + + Inaktive + + Private + + I alt diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5eebd8a8f5bf..bee8507ddacb 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -72,11 +72,6 @@ Auf diesem Gerät keine Spuren hinterlassen - - %1$s löscht Ihre Cookies, Chronik und Website-Daten, wenn Sie alle Ihre privaten Fenster schließen. %2$s Seite durchsuchen + + Seite übersetzen In Sammlung speichern @@ -282,7 +279,7 @@ Suchvorschläge in privaten Sitzungen erlauben? - %s übermittelt Ihre Eingaben in die Adressleiste an Ihre Standard-Suchmaschine. + %s übermittelt Ihre Eingaben in die Adressleiste an Ihre Standardsuchmaschine. Suchen mit %s @@ -335,14 +332,8 @@ Nicht jetzt - - Machen Sie Firefox zu Ihrem Browser Nr. 1. Wir schützen Sie gerne - - Firefox stellt Menschen über Gewinne und schützt Ihre Privatsphäre, indem er websiteübergreifende Tracker blockiert.\n\nErfahren Sie mehr in unserem Datenschutzhinweis. Unser gemeinnütziger Browser verhindert, dass Unternehmen heimlich Ihre Aktivitäten im Internet verfolgen.\n\nWeitere Informationen finden Sie in unserem Datenschutzhinweis. Nicht jetzt - Wechseln Sie vom Handy zum Laptop und zurück - Verschlüsseln Sie Ihre Daten, wenn Sie geräteübergreifend arbeiten - - Holen Sie sich die Tabs und Passwörter von Ihren anderen Geräten, um dort weiterzumachen, wo Sie aufgehört haben. Wenn Sie angemeldet sind und Ihre Daten synchronisieren, sind Sie sicherer. Firefox verschlüsselt Ihre Passwörter, Lesezeichen und mehr. @@ -365,15 +352,9 @@ Anmelden Nicht jetzt - - Benachrichtigungen helfen Ihnen, mehr aus Firefox zu machen Benachrichtigungen helfen Ihnen, Firefox noch sicherer zu machen - - Versenden Sie Tabs zwischen Geräten, verwalten Sie Downloads und erhalten Sie Tipps zur optimalen Nutzung von Firefox. Versenden Sie Tabs sicher zwischen Ihren Geräten und entdecken Sie andere Datenschutzfunktionen in Firefox. @@ -416,8 +397,6 @@ Eine Option auswählen - Kürzel für die Suche verwalten - Alternative Suchmaschinen verwalten Im Suchmenü sichtbare Suchmaschinen bearbeiten @@ -431,8 +410,6 @@ Suchmaschinen Vorschläge von Suchmaschinen - - Adressleiste Einstellungen der Adressleiste @@ -554,14 +531,10 @@ Möglicherweise handelt es sich aber auch um einen Angriff. Wenn Sie die Website trotzdem besuchen, sollten Sie keine sensiblen Informationen eingeben. Wenn Sie fortfahren, wird der Nur-HTTPS-Modus vorübergehend für die Webseite deaktiviert. Barrierefreiheit - - Benutzerdefinierter Firefox-Kontoserver Benutzerdefinierter Mozilla-Kontoserver Benutzerdefinierter Sync-Server - - Server für Firefox-Konto/Sync geändert. Anwendung wird beendet, um Änderungen zu übernehmen… Server für Mozilla-Konto/Sync geändert. Anwendung wird beendet, um Änderungen zu übernehmen… @@ -579,8 +552,6 @@ Melden Sie sich an, um Tabs, Lesezeichen, Passwörter und mehr zu synchronisieren. - Firefox-Konto - Mozilla-Konto Stellen Sie die Verbindung erneut her, um die Synchronisierung fortzusetzen @@ -592,8 +563,6 @@ Datenerhebung Externes Debugging über USB - - Suchmaschinen anzeigen Suchvorschläge anzeigen @@ -725,12 +694,6 @@ Entdecken Sie weitere Add-ons - - - Add-on wird nicht unterstützt - - Add-on ist bereits installiert - Add-ons sind temporär deaktiviert @@ -1389,6 +1352,11 @@ Private Tabs schließen + + + Private Tabs schließen? + Tippen oder wischen Sie auf diese Benachrichtigung, um private Tabs zu schließen. + Marketing @@ -1631,6 +1599,8 @@ Alle Cookies (einige Websites funktionieren dann nicht mehr) Seitenübergreifende Cookies + + Websites anweisen, meine Daten nicht zu verkaufen oder weiterzugeben Inhalte zur Aktivitätenverfolgung @@ -1970,28 +1940,18 @@ Neue Suchmaschine hinzufügen Suchmaschine bearbeiten - - Hinzufügen - - Speichern Bearbeiten Löschen - - Andere Name - - Name Name der Suchmaschine Such-String-URL - Zu verwendender Such-String - Für die Suche zu verwendende URL Anfrage durch „%s“ ersetzen. Beispiel:\nhttps://www.google.com/search?q=%s @@ -2220,8 +2180,6 @@ - Rezensionsprüfer - Rezensionsprüfer Zuverlässige Bewertungen @@ -2234,7 +2192,9 @@ Bewertungen angepasst - Unzuverlässige Bewertungen entfernt + Unzuverlässige Bewertungen entfernt + + Basierend auf zuverlässigen Bewertungen Highlights aus aktuellen Bewertungen @@ -2245,14 +2205,10 @@ Bewertung von A bis F.]]> Zuverlässige Bewertungen. Wir glauben, dass die Bewertungen von echten Kunden stammen, die ehrliche und unvoreingenommene Bewertungen hinterlassen. - - Wir halten die Bewertungen für zuverlässig. Wir glauben, dass es eine Mischung aus zuverlässigen und unzuverlässigen Bewertungen gibt. Unzuverlässige Bewertungen. Wir glauben, dass die Bewertungen wahrscheinlich gefälscht, oder von voreingenommenen Bewertern sind. - - Wir halten die Bewertungen für unzuverlässig. angepasste Bewertung basiert nur auf Bewertungen, die wir für zuverlässig halten.]]> @@ -2268,8 +2224,6 @@ Werbung im Rezensionsprüfer anzeigen - Sie sehen gelegentlich Anzeigen für relevante Produkte. Alle Anzeigen müssen unseren Qualitätsstandards für Bewertungen entsprechen. %s - Sie sehen gelegentlich Anzeigen für relevante Produkte. Wir bewerben nur Produkte mit vertrauenswürdigen Bewertungen. %s Weitere Informationen @@ -2292,23 +2246,23 @@ Wenn dieses Produkt mehr Bewertungen hat, können wir deren Qualität überprüfen. - Produkt ist nicht verfügbar + Produkt ist nicht verfügbar - Wenn Sie sehen, dass dieses Produkt wieder auf Lager ist, melden Sie es und wir arbeiten an der Überprüfung der Bewertungen. + Wenn Sie sehen, dass dieses Produkt wieder auf Lager ist, melden Sie es und wir arbeiten an der Überprüfung der Bewertungen. - Melden, dass dieses Produkt wieder auf Lager ist - - Melden, dass das Produkt vorrätig ist + Melden, dass das Produkt vorrätig ist - Qualität der Bewertung wird überprüft + Qualität der Bewertung wird überprüft - Qualität der Bewertung wird überprüft + Qualität der Bewertung wird überprüft + + Qualität der Bewertungen wird überprüft (%s) Dies kann etwa 60 Sekunden dauern. - Danke für die Meldung! + Danke für die Meldung! - Wir sollten innerhalb von 24 Stunden Informationen über die Bewertungen dieses Produkts haben. Bitte versuchen Sie es später noch einmal. + Wir sollten innerhalb von 24 Stunden Informationen über die Bewertungen dieses Produkts haben. Bitte versuchen Sie es später noch einmal. Wir können diese Bewertungen nicht überprüfen @@ -2346,17 +2300,17 @@ Weitere Informationen - Indem Sie „Ja, ausprobieren“ auswählen, stimmen Sie der %2$s und den %3$s von %1$s zu, das von Mozilla angeboten wird. + Indem Sie „Ja, ausprobieren“ auswählen, stimmen Sie der %2$s und den %3$s von %1$s zu, das von Mozilla angeboten wird. - Indem Sie „Ja, ausprobieren“ auswählen, stimmen Sie dem folgenden von %1$s zu: + Indem Sie „Ja, ausprobieren“ auswählen, stimmen Sie dem folgenden von %1$s zu: - Datenschutzerklärung + Datenschutzerklärung - Datenschutzrichtlinie + Datenschutzrichtlinie - Nutzungsbedingungen + Nutzungsbedingungen - Nutzungsbedingungen + Nutzungsbedingungen Ja, ausprobieren @@ -2392,6 +2346,9 @@ Wettbewerbsfähigkeit + + „%s“ + Einklappen @@ -2409,4 +2366,203 @@ Link öffnen, um mehr zu erfahren %s, Überschrift + + + Links + + Verfügbare Links + + + + + + Diese Seite übersetzen? + + Private Übersetzungen in %1$s ausprobieren + + Zu Sicherstellung Ihrer Privatsphäre verlassen Übersetzungen niemals Ihr Gerät. Neue Sprachen und Verbesserungen folgen bald! %1$s + + Weitere Informationen + + Übersetzen von + + Übersetzen auf + + Nicht jetzt + + Fertig + + Übersetzen + + Erneut versuchen + + Übersetzen + + Übersetzung läuft + + + Beim Übersetzen ist ein Problem aufgetreten. Bitte versuchen Sie es erneut. + + Sprachen konnten nicht geladen werden. Überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut. + + Es tut uns leid, wir unterstützen %1$s noch nicht. + + Weitere Informationen + + + + Übersetzungsoptionen + + Übersetzung immer anbieten + + %1$s immer übersetzen + + %1$s nie übersetzen + + Diese Website nie übersetzen + + Einstellungen für die Übersetzung + + Über Übersetzungen in %1$s + + + + Übersetzungen + + Übersetzung nach Möglichkeit anbieten + + Sprachen immer im Datensparmodus herunterladen + + Einstellungen für die Übersetzung + + Automatische Übersetzung + + Diese Websites nie übersetzen + + Sprachen herunterladen + + + + Automatische Übersetzung + + Wählen Sie eine Sprache aus, um die Einstellungen für „Immer übersetzen“ und „Nie übersetzen“ zu verwalten. + + + + Übersetzung anbieten (Standard) + + %1$s bietet an, Websites in diese Sprache zu übersetzen. + + Immer übersetzen + + %1$s übersetzt diese Sprache automatisch, wenn die Seite geladen wird. + + Nie übersetzen + + %1$s wird niemals anbieten, Websites in diese Sprache zu übersetzen. + + + + Diese Websites nie übersetzen + + Um eine neue Website hinzuzufügen: Besuchen Sie diese und wählen Sie „Diese Website nie übersetzen“ aus dem Übersetzungsmenü. + + %1$s entfernen + + %1$s löschen? + + Löschen + + Abbrechen + + + + Sprachen herunterladen + + Laden Sie vollständige Sprachen herunter, um schnellere Übersetzungen zu erhalten und offline zu übersetzen. %1$s + + Weitere Informationen + + Verfügbare Sprachen + + erforderlich + + %1$s (%2$s) + + Sprachen herunterladen + + Alle Sprachen + + Löschen + + In Arbeit + + Herunterladen + + Ausgewählt + + + %1$s (%2$s) löschen? + + Wenn Sie diese Sprache löschen, lädt %1$s beim Übersetzen Teile der Sprachen in Ihren Cache herunter. + + Alle Sprachen löschen (%1$s)? + + Wenn Sie alle Sprachen löschen, lädt %1$s während der Übersetzung Teile davon in Ihren Cache herunter. + + Löschen + + Abbrechen + + + Im Datensparmodus herunterladen (%1$s)? + + Wir laden Teile von Sprachen in Ihren Cache herunter, um die Übersetzungen privat zu halten. + + Immer im Datensparmodus herunterladen + + Herunterladen + + Herunterladen und übersetzen + + Abbrechen + + + + Werkzeuge zur Fehlerbehebung + + Rückwärts navigieren + + Tab-Werkzeuge + + Tab-Anzahl + + Aktiv + + Inaktiv + + Privat + + Gesamt + + Werkzeug zur Tab-Erstellung + + Zu erstellende Tab-Anzahl + + Zu aktiven Tabs hinzufügen + + Zu inaktiven Tabs hinzufügen + + Zu privaten Tabs hinzufügen diff --git a/app/src/main/res/values-dsb/strings.xml b/app/src/main/res/values-dsb/strings.xml index 4f44f48b699b..12383fd23b70 100644 --- a/app/src/main/res/values-dsb/strings.xml +++ b/app/src/main/res/values-dsb/strings.xml @@ -69,11 +69,6 @@ Na toś tom rěźe žedne slědy njezawóstajiś - - %1$s waše cookieje, historiju a sedłowe daty wulašujo, gaž wšykne swóje priwatne wokna zacynjaśo. %2$s Na boku pytaś + + Bok pśełožyś Do zběrki składowaś @@ -329,14 +326,8 @@ Nic něnto - - Wužywajśo Firefox pó droze Šćitamy was rad - - Firefox luźi nad wudobytki staja a blokěrujo sedła pśesegajuce slědowaki, aby wašu priwatnosć šćitał.\n\nDalšne informacije w našej powěźeńce priwatnosći. Naš za wšykne wužytny wobglědowak tomu zajźujo, až pśedewześa wam kšajźu pó interneśe slěduju.\n\nDalšne informacije w našej powěźeńce priwatnosći. Nic něnto - Skócćo wó telefona do laptopa a slědk - Wóstańśo skoděrowany, gaž někotare rědy wužywaśo - - Wobstarajśo se rejtariki a gronidła z drugich rědow, aby tam pókšacował, źož sćo pśestał. Gaž sćo se pśizjawił a sćo synchronizěrował, sćo wěsćejšy. Firefox waše gronidła, cytańske znamjenja a wěcej koděrujo. @@ -360,15 +347,9 @@ Nic něnto - - Powěźeńki wam pomagaju, wěcej z Firefox cyniś Powěźeńki wam pomagaju, z Firefox wěsćejšy wóstaś - - Sćelśo rejtariki mjazy rědami, zastojśo ześěgnjenja a dostańśo pokaze, aby nejwěcej z Firefox wuwónoźeł. Rozesćełajśo rejtariki mjazy swójimi rědami a namakajśo druge funkcije priwatnosći w Firefox. @@ -410,8 +391,6 @@ Wubjeŕśo jadnu - Pytańske skrotconki zastojaś - Alternatiwne pytnice zastojaś Pytnice wobźěłaś, kótarež su w pytańskem meniju @@ -425,8 +404,6 @@ Pytnice Naraźenja wót pytnicow - - Adresowe pólo Nastajenja adresowego póla @@ -547,14 +524,10 @@ Jo pak teke móžno, až se wó napad jadna. Jolic se websedłoju weto woglědujośo, wy njeměł sensibelne informacije zapódaś. Jolic pókšacujośo, se modus Jano-HTTPS nachylu za sedło znjemóžnijo. Bźezbariernosć - - Swójski kontowy serwer Firefox Swójski kontowy serwer Mozilla Swójski synchronizěrowański serwer - - Kontowy resp. synchronizěrowański serwer Firefox jo se změnił. Nałoženje se kóńcy, aby se změny nałožyli… Kontowy resp. synchronizěrowański serwer Mozilla jo se změnił. Nałoženje se kóńcy, aby se změny nałožyli… @@ -572,8 +545,6 @@ Zregistrěrujśo se, aby rejtariki, cytańske znamjenja, gronidła a dalšne synchronizěrował. - Konto Firefox - Konto Mozilla Zasej zwězaś, aby ze synchronizaciju pókšacowało @@ -585,8 +556,6 @@ Zběranje datow Daloke pytanje zmólkow pśez USB - - Pytnice pokazaś Pytańske naraźenja pokazaś @@ -718,12 +687,6 @@ Dodanki wuslěźiś - - - Dodank se njepódpěra - - Dodank jo južo zainstalowany. - Dodanki su nachylu znjemóžnjone @@ -1360,6 +1323,11 @@ Priwatne rejtariki zacyniś + + + Priwatne rejtariki zacyniś? + Pótusniśo toś tu powěźeńku abo zjěźćo pśez nju, aby priwatne rejtariki zacynił. + Marketing @@ -1595,6 +1563,8 @@ Wšykne cookieje (buźo zawinowaś, až websedła njefunkcioněruju) Sedła pśesegajuce cookieje izolěrowaś + + Websydłam k wěsći daś, až njamaju daty źěliś a pśedaś Slědujuce wopśimjeśe @@ -1936,28 +1906,18 @@ Nowu pytnicu pśidaś Pytnicu wobźěłaś - - Pśidaś - - Składowaś Wobźěłaś Lašowaś - - Druge - - Mě pytnice URL pytańskego wuraza - Pytański wuraz, kótaryž ma se wužywaś - URL, kótaryž se ma za pytanje wužywaś Napšašowanje z „%s“ wuměniś. Pśikład: \nhttps://www.google.com/search?q=%s @@ -2187,8 +2147,6 @@ - Kontrola pógódnośenjow - Kontrola pógódnośenjow Spušćobne pógódnośenja @@ -2201,7 +2159,9 @@ Pśměrjone pógódnośowanje - Njespušćobne pógódnośenja wótwónoźone + Njespušćobne pógódnośenja wótwónoźone + + Bazěrujo na spušćobnych pógódnośenjach Wjerški z nejnowšych pógódnośenjow @@ -2213,14 +2173,10 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt pismikowu cenzuru wót A do F.]]> Spušćobne pógódnośenja. Myslimy se, až pógódnośenja su nejskerjej wót wopšawdnych kupcow, kótarež su zawóstajili spšawne, bźezpśedsudkowe pógódnośenja. - - Wěrimy, až pógódnośenja su spušćobne. Wěrimy, až dajo měšańcu spušćobnych a njespušćobnych pógódnośenjow. Njespušćobne pógódnośenja. Myslimy se, až pógódnośenja su nejskerjej sfalšowane abo wót pógódnośujucych z pśedsudkami. - - Wěrimy, až pógódnośenja njejsu spušćobne. Pśiměrjone pógódnośowanje jano na pógódnośenjach bazěrujo, kótarež mamy za spušćobne.]]> @@ -2236,8 +2192,6 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt Wabjenje w kontroli pógódnośenjow pokazaś - Buźośo wótergi wabjenje za relewantne produkty wiźeś. Wšykne wabjeńske anonse muse našym standardam za kwalitu pógódnośenjow wótpowědowaś. %s - Buźośo pśi góźbje wabjenje za relewantne produkty wiźeś. Wabimy jano za produkty ze spušćobnymi pógódnośenjami. %s Dalšne informacije @@ -2260,24 +2214,24 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt Gaž toś ten produkt ma wěcej pógódnośenjow, móžomy jich kwalitu kontrolěrowaś. - Produkt njejo k dispoziciji + Produkt njejo k dispoziciji - Jolic wiźiśo, až toś ten produkt jo zasej na skłaźe, dajśo to k wěsći a buźomy na kontrolěrowanju pógódnośenjow źěłaś. + Jolic wiźiśo, až toś ten produkt jo zasej na skłaźe, dajśo to k wěsći a buźomy na kontrolěrowanju pógódnośenjow źěłaś. - K wěsći daś, až toś ten produkt jo zasej na skłaźe - - K wěsći daś, až produkt jo na skłaźe + K wěsći daś, až produkt jo na skłaźe - Kontrola kwalitu pógódnośenjow + Kontrola kwalitu pógódnośenjow - Kontrola kwalitu pógódnośenjow + Kontrola kwalitu pógódnośenjow + + Kontrola kwalitu pógódnośenjow (%s) To mógło na 60 sekundow traś. - Wjeliki źěk za powěźeńku! + Wjeliki źěk za powěźeńku! - My dejali w běgu 24 góźin informacije wó pógódnośenjach toś togo produkta měś. Pśiźćo pšosym mimo. + My dejali w běgu 24 góźin informacije wó pógódnośenjach toś togo produkta měś. Pśiźćo pšosym mimo. Njamóžomy toś te pógódnośenja pśeglědowaś @@ -2315,17 +2269,17 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt Dalšne informacije - Gaž „Jo, wopytaś“ wuběraśo, zwólijośo do %2$s a %3$s Mozilla za %1$s. + Gaž „Jo, wopytaś“ wuběraśo, zwólijośo do %2$s a %3$s Mozilla za %1$s. - Gaž „Jo, wopytaś“ wuběraśo, zwólijośo do slědujucego wót %1$s: + Gaž „Jo, wopytaś“ wuběraśo, zwólijośo do slědujucego wót %1$s: - pšawidła priwatnosći + pšawidła priwatnosći - Pšawidła priwatnosći + Pšawidła priwatnosći - wužywańske wuměnjenja + wužywańske wuměnjenja - Wužywańske wuměnjenja + Wužywańske wuměnjenja Jo, wopytaś @@ -2361,6 +2315,9 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt Zamóžnosć do wuběźowanja + + „%s“ + schowaś @@ -2378,4 +2335,204 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt wótkaz wócyniś, aby wy wěcej zgónił %s, nadpismo + + + Wótkaze + + Wótkaze, kótarež su k dispoziciji + + + + + + Toś ten bok pśełožowaś? + + Priwatne pśełožki w %1$s testowaś + + Za wašu priwatnosć pśełožki waš rěd nigda njespušćaju. Nowe rěcy a pólěpšenja skóro pśidu! %1$s + + Dalšne informacije + + Žrědłowa rěc + + Celowa rěc + + Nic něnto + + Dokóńcone + + Pśełožyś + + Hyšći raz wopytaś + + Pśełožowanje + + Pśełoženje běžy + + + Pśi pśełožowanju jo problem nastał. Pšosym wopytajśo hyšći raz. + + Rěcy njedaju se zacytaś. Pśeglědajśo swój internetny zwisk a wopytajśo hyšći raz. + + %1$s bóžko hyšći njepódpěramy. + + Dalšne informacije + + + + Pśełožowańske nastajenja + + Pśełožk pśecej póbitowaś + + %1$s pśecej pśełožyś + + %1$s nigda njepśełožowaś + + Njepśełožujśo nigda toś to sedło + + Pśełožowańske nastajenja + + Wó pśełožkach w %1$s + + + + Pśełožki + + Pśełožowanje póbitowaś, gaž móžno + + Rěcy pśecej w datowem žarjeńskem modusu ześěgnuś + + Pśełožowańske nastajenja + + Awtomatiske pśełožowanje + + Toś te websedła nigda njepśełožyś + + Rěcy ześěgnuś + + + + Awtomatiske pśełožowanje + + Wubjeŕśo rěc, aby nastajeni „pśecej pśełožyś“ a „nigda njepśełožyś“ zastojał. + + + + Pśełožk póbitowaś (standard) + + %1$s póbitujo, sedła do toś teje rěcy pśełožowaś. + + Pśecej pśełožyś + + + %1$s buźo toś tu rěc awtomatiski pśełožowaś, gaž se bok zacytajo. + + Nigda njepśełožowaś + + %1$s nigda njepóbitujo, sedła do toś teje rěcy pśełožowaś. + + + + Toś te websedła nigda njepśełožyś + + Aby nowe sedło pśidał: Woglědajśo se k njomu a wubjeŕśo „Toś to sedło nigda njepśełožyś“ z pśełožowańskego menija. + + %1$s wótwónoźeś + + %1$s lašowaś? + + Lašowaś + + Pśetergnuś + + + + Rěcy ześěgnuś + + Ześěgniśo dopołne rěcy za malsnjejše pśełožki a aby offline pśełožował. %1$s + + Dalšne informacije + + K dispoziciji stojece rěcy + + trjebny + + %1$s (%2$s) + + Rěcy ześěgnuś + + Wšykne rěcy + + Lašowaś + + Běžy + + Ześěgnuś + + Wubrany + + + %1$s (%2$s) lašowaś? + + Jolic toś tu rěc lašujośo, %1$s źělne rěcy do wašogo cache ześěgnjo, gaž pśełožujośo. + + Wšykne rěcy (%1$s) lašowaś? + + Jolic wšykne rěcy lašujośo, %1$s źělne rěcy do wašogo cache ześěgnjo, gaž pśełožujośo. + + Lašowaś + + Pśetergnuś + + + W datowem žarjeńskem modusu ześěgnuś (%1$s)? + + Ześěgujomy źělne rěcy do wašogo cache, aby pśełožki priwatne źaržali. + + Pśecej w datowem žarjeńskem modusu ześěgnuś + + Ześěgnuś + + Ześěgnuś a pśełožyś + + Pśetergnuś + + + + Rědy za rozwězanje problemow + + Slědk nawigěrowaś + + Rejtarikowe rědy + + Licba rejtarikow + + Aktiwny + + Njeaktiwny + + Priwatny + + Dogromady + + Rěd za napóranje rejtarikow + + Licba rejtarikow, kótarež se maju napóraś + + Aktiwnym rejtarikam pśidaś + + Inaktiwnym rejtarikam pśidaś + + Priwatnym rejtarikam pśidaś diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 7ae8ef7f2361..33be357bbae0 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -78,12 +78,7 @@ private mode in our new Total Private Browsing mode. The first parameter is the name of the app defined in app_name (for example: Firefox Nightly) The second parameter is the clickable link text in felt_privacy_info_card_subtitle_link_text --> - Το %1$s διαγράφει τα cookies, το ιστορικό και τα δεδομένα ιστοτόπων σας όταν κλείνετε όλα τα ιδιωτικά σας παράθυρα. %2$s - - Το %1$s διαγράφει τα cookies, το ιστορικό και τα δεδομένα ιστοτόπων σας όταν κλείνετε όλες τις ιδιωτικές σας καρτέλες. %2$s + Το %1$s διαγράφει τα cookie, το ιστορικό και τα δεδομένα ιστοτόπων σας όταν κλείνετε όλες τις ιδιωτικές σας καρτέλες. %2$s @@ -114,7 +109,7 @@ - Πατήστε εδώ για να ξεκινήσετε μια νέα ιδιωτική συνεδρία. Διαγράψτε το ιστορικό σας, τα cookies… τα πάντα. + Πατήστε εδώ για να ξεκινήσετε μια νέα ιδιωτική συνεδρία. Διαγράψτε το ιστορικό σας, τα cookie… τα πάντα. @@ -223,6 +218,8 @@ Εύρεση στη σελίδα + + Μετάφραση σελίδας Αποθήκευση στη συλλογή @@ -337,14 +334,8 @@ Όχι τώρα - - Ορίστε το FIrefox ως το προεπιλεγμένο πρόγραμμα περιήγησής σας Μας αρέσει να σας προστατεύουμε - - Το Firefox θέτει σε προτεραιότητα τους ανθρώπους και όχι τα κέρδη, προστατεύοντας το απόρρητό σας με αποκλεισμό των ιχνηλατών μεταξύ ιστοτόπων.\n\nΜάθετε περισσότερα στη σημείωση απορρήτου μας. Το πρόγραμμα περιήγησης του μη κερδοσκοπικού μας οργανισμού σταματά τις εταιρείες από το να σας ακολουθούν κρυφά σε όλο το διαδίκτυο.\n\nΜάθετε περισσότερα στη σημείωση απορρήτου μας. Όχι τώρα - Εναλλαγή από τηλέφωνο σε υπολογιστή και αντίστροφα - Διατηρήστε την κρυπτογράφηση κατά την εναλλαγή των συσκευών - - Λάβετε καρτέλες και κωδικούς πρόσβασης από τις άλλες συσκευές σας για να συνεχίσετε από εκεί που σταματήσατε. Όταν είστε συνδεδεμένοι και συγχρονισμένοι, είστε πιο ασφαλείς. Το Firefox κρυπτογραφεί τους κωδικούς πρόσβασης, τους σελιδοδείκτες σας και πολλά άλλα. @@ -367,15 +354,9 @@ Σύνδεση Όχι τώρα - - Οι ειδοποιήσεις σάς βοηθούν να κάνετε περισσότερα με το Firefox Οι ειδοποιήσεις σάς βοηθούν να παραμένετε ασφαλείς με το Firefox - - Αποστολή καρτελών μεταξύ συσκευών, διαχείριση λήψεων και λήψη συμβουλών για την αξιοποίηση του Firefox στο έπακρο. Στείλτε με ασφάλεια καρτέλες μεταξύ των συσκευών σας και ανακαλύψτε άλλες λειτουργίες απορρήτου στο Firefox. @@ -418,8 +399,6 @@ Επιλέξτε μία - Διαχείριση συντομεύσεων αναζήτησης - Διαχείριση εναλλακτικών μηχανών αναζήτησης Επεξεργαστείτε τις μηχανές που εμφανίζονται στο μενού αναζήτησης @@ -433,8 +412,6 @@ Μηχανές αναζήτησης Προτάσεις από μηχανές αναζήτησης - - Γραμμή διευθύνσεων Προτιμήσεις γραμμής διευθύνσεων @@ -468,20 +445,20 @@ Λειτουργία «Μόνο HTTPS» - Μείωση μηνυμάτων για cookies + Μείωση μηνυμάτων για cookie Αποκλεισμός μηνυμάτων για cookie Αποκλεισμός μηνυμάτων για cookie σε ιδιωτική περιήγηση - Μείωση μηνυμάτων για cookies + Μείωση μηνυμάτων για cookie Ανενεργή Ενεργή - Το %1$s προσπαθεί να απορρίπτει αυτόματα τα μηνύματα αιτημάτων για cookies. + Το %1$s προσπαθεί να απορρίπτει αυτόματα τα μηνύματα αιτημάτων για cookie. Ανενεργή για αυτόν τον ιστότοπο @@ -499,33 +476,33 @@ Ο ιστότοπος δεν υποστηρίζεται - Ενεργοποίηση μείωσης μηνυμάτων για cookies στο %1$s; + Ενεργοποίηση μείωσης μηνυμάτων για cookie στο %1$s; Ενεργοποίηση αποκλεισμού μηνυμάτων για cookie για το %1$s; - Απενεργοποίηση μείωσης μηνυμάτων για cookies στο %1$s; + Απενεργοποίηση μείωσης μηνυμάτων για cookie στο %1$s; Απενεργοποίηση αποκλεισμού μηνυμάτων για cookie για το %1$s; - Το %1$s δεν μπορεί να απορρίψει αυτόματα τα αιτήματα για cookies σε αυτόν τον ιστότοπο. Μπορείτε να στείλετε ένα αίτημα για υποστήριξη αυτού του ιστοτόπου στο μέλλον. + Το %1$s δεν μπορεί να απορρίψει αυτόματα τα αιτήματα για cookie σε αυτόν τον ιστότοπο. Μπορείτε να στείλετε ένα αίτημα για υποστήριξη αυτού του ιστοτόπου στο μέλλον. - Το %1$s θα απαλείψει τα cookies του ιστοτόπου και θα ανανεώσει τη σελίδα. Η απαλοιφή όλων των cookies ενδέχεται να σας αποσυνδέσει ή να αδειάσει τα καλάθια αγορών. + Το %1$s θα απαλείψει τα cookie του ιστοτόπου και θα ανανεώσει τη σελίδα. Η απαλοιφή όλων των cookie ενδέχεται να σας αποσυνδέσει ή να αδειάσει τα καλάθια αγορών. Απενεργοποιήστε το και το %1$s θα διαγράψει τα cookie και θα φορτώσει ξανά αυτόν τον ιστότοπο. Μπορεί να αποσυνδεθείτε ή να αδειάσουν τα καλάθια αγορών σας. - Το %1$s προσπαθεί να απορρίψει αυτόματα όλα τα αιτήματα για cookies σε υποστηριζόμενους ιστότοπους. + Το %1$s προσπαθεί να απορρίψει αυτόματα όλα τα αιτήματα για cookie σε υποστηριζόμενους ιστοτόπους. Ενεργοποιήστε το και το %1$s θα προσπαθεί να απορρίπτει αυτόματα όλα τα μηνύματα για cookie σε αυτόν τον ιστότοπο. - Να επιτρέπεται στο %1$s η απόρριψη μηνυμάτων για cookies; + Να επιτρέπεται στο %1$s η απόρριψη μηνυμάτων για cookie; - Το %1$s μπορεί να απορρίπτει αυτόματα πολλά μηνύματα αιτημάτων για cookies. + Το %1$s μπορεί να απορρίπτει αυτόματα πολλά μηνύματα αιτημάτων για cookie. Όχι τώρα - Θα βλέπετε λιγότερα αιτήματα για cookies + Θα βλέπετε λιγότερα αιτήματα για cookie Αποδοχή @@ -557,14 +534,10 @@ Ωστόσο, είναι επίσης πιθανό να εμπλέκεται ένας εισβολέας. Εάν συνεχίσετε στον ιστότοπο, δεν θα πρέπει να εισαγάγετε ευαίσθητες πληροφορίες. Εάν συνεχίσετε, η λειτουργία «Μόνο HTTPS» θα απενεργοποιηθεί προσωρινά για τον ιστότοπο. Προσβασιμότητα - - Προσαρμοσμένος διακομιστής λογαριασμού Firefox Προσαρμοσμένος διακομιστής λογαριασμού Mozilla Προσαρμοσμένος διακομιστής Sync - - Ο διακομιστής λογαριασμού Firefox/Sync τροποποιήθηκε. Τερματισμός εφαρμογής για εφαρμογή αλλαγών… Ο διακομιστής λογαριασμού Mozilla και συγχρονισμού τροποποιήθηκε. Γίνεται τερματισμός της εφαρμογής για εφαρμογή των αλλαγών… @@ -583,8 +556,6 @@ Συνδεθείτε για να συγχρονίσετε τις καρτέλες, τους σελιδοδείκτες, τους κωδικούς πρόσβασης και πολλά άλλα. - Λογαριασμός Firefox - Λογαριασμός Mozilla Συνδεθείτε ξανά για συνέχεια συγχρονισμού @@ -596,8 +567,6 @@ Συλλογή δεδομένων Απομακρυσμένος έλεγχος σφαλμάτων μέσω USB - - Εμφάνιση μηχανών αναζήτησης Εμφάνιση προτάσεων αναζήτησης @@ -730,12 +699,6 @@ Εξερεύνηση προσθέτων - - - Το πρόσθετο δεν υποστηρίζεται - - Το πρόσθετο είναι ήδη εγκατεστημένο - Τα πρόσθετα έχουν απενεργοποιηθεί προσωρινά @@ -1217,7 +1180,7 @@ Μόνιμη αποθήκευση - Cookies μεταξύ ιστοτόπων + Cookie μεταξύ ιστοτόπων Περιεχόμενο με έλεγχο DRM @@ -1359,7 +1322,7 @@ Το κατάλαβα - Αδυναμία κοινοποίησης σε αυτή την εφαρμογή + Δεν είναι δυνατή η κοινοποίηση σε αυτήν την εφαρμογή Αποστολή σε συσκευή @@ -1374,6 +1337,9 @@ Κλείσιμο ιδιωτικών καρτελών + + Κλείσιμο ιδιωτικών καρτελών; + Μάρκετινγκ @@ -1387,7 +1353,7 @@ Δοκιμάστε την ιδιωτική περιήγηση - Περιηγηθείτε χωρίς αποθηκευμένα cookies ή ιστορικό στο %1$s + Περιηγηθείτε χωρίς αποθηκευμένα cookie ή ιστορικό στο %1$s Περιηγηθείτε χωρίς να αφήσετε ίχνη @@ -1481,7 +1447,7 @@ number of history items the user has --> %d διευθύνσεις - Cookies και δεδομένα ιστοτόπων + Cookie και δεδομένα ιστοτόπων Θα αποσυνδεθείτε από τους περισσότερους ιστοτόπους @@ -1504,7 +1470,7 @@ Χρονικό διάστημα διαγραφής - Διαγράφει το ιστορικό (και το συγχρονισμένο ιστορικό άλλων συσκευών), τα cookies και άλλα δεδομένα περιήγησης. + Διαγράφει το ιστορικό (και το συγχρονισμένο ιστορικό άλλων συσκευών), τα cookie και άλλα δεδομένα περιήγησης. Διαγράφει το ιστορικό (καθώς και το συγχρονισμένο ιστορικό από άλλες συσκευές) @@ -1602,17 +1568,19 @@ Τι αποκλείει η προσαρμοσμένη προστασία από καταγραφή - Cookies + Cookie Ιχνηλάτες μεταξύ ιστοτόπων και κοινωνικών δικτύων - Cookies από ιστοτόπους που δεν έχετε επισκεφθεί + Cookie από ιστοτόπους που δεν έχετε επισκεφθεί - Όλα τα cookies τρίτων (πιθανή δυσλειτουργία ιστοτόπων) + Όλα τα τρίτα cookie (πιθανή δυσλειτουργία ιστοτόπων) - Όλα τα cookies (προκαλεί δυσλειτουργία ιστοτόπων) + Όλα τα cookie (προκαλεί δυσλειτουργία ιστοτόπων) - Απομόνωση cookies μεταξύ ιστοτόπων + Απομόνωση cookie μεταξύ ιστοτόπων + + Αποστολή αιτήματος μη πώλησης και κοινοποίησης των δεδομένων μου στους ιστοτόπους Περιεχόμενο καταγραφής @@ -1634,13 +1602,13 @@ Περιορίζει την ικανότητα των κοινωνικών δικτύων να παρακολουθούν τη δραστηριότητά σας στο διαδίκτυο. - Cookies καταγραφής μεταξύ ιστοτόπων + Cookie καταγραφής μεταξύ ιστοτόπων - Cookies μεταξύ ιστοτόπων + Cookie μεταξύ ιστοτόπων - Αποκλείει τα cookies που χρησιμοποιούν οι εταιρείες διαφημίσεων και ανάλυσης για τη συλλογή δεδομένων περιήγησης σε πολλαπλούς ιστοτόπους. + Αποκλείει τα cookie που χρησιμοποιούν οι εταιρείες διαφημίσεων και ανάλυσης για τη συλλογή δεδομένων περιήγησης σε πολλαπλούς ιστοτόπους. - Η Ολική προστασία cookie απομονώνει τα cookies στον ιστότοπο που βρίσκεστε, ώστε να μην μπορούν να χρησιμοποιηθούν από ιχνηλάτες, όπως δίκτυα διαφημίσεων, για την καταγραφή της δραστηριότητάς σας. + Η Ολική προστασία cookie απομονώνει τα cookie στον ιστότοπο που βρίσκεστε, ώστε να μην μπορούν να χρησιμοποιηθούν από ιχνηλάτες, όπως δίκτυα διαφημίσεων, για την καταγραφή της δραστηριότητάς σας. Cryptominer @@ -1673,7 +1641,7 @@ Ανακατεύθυνση ιχνηλατών - Διαγράφει τα cookies από ανακατευθύνσεις σε γνωστούς ιστοτόπους καταγραφής. + Διαγράφει τα cookie από ανακατευθύνσεις σε γνωστούς ιστοτόπους καταγραφής. @@ -1956,29 +1924,19 @@ Προσθήκη νέας μηχανής αναζήτησης Επεξεργασία μηχανής αναζήτησης - - Προσθήκη - - Αποθήκευση Επεξεργασία Διαγραφή - - Άλλη Όνομα - - Όνομα Όνομα μηχανής αναζήτησης URL όρου αναζήτησης - Νήμα αναζήτησης προς χρήση - URL για χρήση στην αναζήτηση Αντικαταστήστε τον όρο αναζήτησης με «%s». Παράδειγμα:\nhttps://www.google.com/search?q=%s @@ -1996,9 +1954,9 @@ Αποθήκευση - Εισάγετε όνομα μηχανής αναζήτησης + Εισαγάγετε όνομα μηχανής αναζήτησης - Εισάγετε νήμα αναζήτησης + Εισαγάγετε νήμα αναζήτησης Βεβαιωθείτε ότι το νήμα αναζήτησης συμφωνεί με την μορφή του παραδείγματος @@ -2026,9 +1984,9 @@ Η σύνδεση δεν είναι ασφαλής - Απαλοιφή cookies και δεδομένων ιστοτόπων + Απαλοιφή cookie και δεδομένων ιστοτόπων - %s;]]> + %s;]]> Θέλετε σίγουρα να διαγράψετε όλα τα δικαιώματα για όλους τους ιστοτόπους; @@ -2038,7 +1996,7 @@ Καμία εξαίρεση ιστοτόπων - Θέλετε σίγουρα να διαγράψετε αυτό το σελιδοδείκτη; + Θέλετε σίγουρα να διαγράψετε αυτόν τον σελιδοδείκτη; Προσθήκη συντόμευσης @@ -2210,8 +2168,6 @@ - Έλεγχος κριτικών - Έλεγχος κριτικών Αξιόπιστες κριτικές @@ -2224,7 +2180,9 @@ Αναπροσαρμοσμένη βαθμολογία - Οι αναξιόπιστες κριτικές αφαιρέθηκαν + Οι αναξιόπιστες κριτικές αφαιρέθηκαν + + Με βάση αξιόπιστες κριτικές Σημαντικά σημεία από πρόσφατες κριτικές @@ -2235,14 +2193,10 @@ βαθμό, από A έως F.]]> Αξιόπιστες κριτικές. Πιστεύουμε ότι οι κριτικές προέρχονται πιθανότατα από πραγματικούς πελάτες, που άφησαν ειλικρινείς και αντικειμενικές κριτικές. - - Πιστεύουμε ότι οι κριτικές είναι αξιόπιστες. Πιστεύουμε ότι υπάρχει ένας συνδυασμός αξιόπιστων και αναξιόπιστων κριτικών. Αναξιόπιστες κριτικές. Πιστεύουμε ότι οι κριτικές είναι μάλλον ψευδείς ή προέρχονται από άτομα που μεροληπτούν. - - Πιστεύουμε ότι οι κριτικές είναι αναξιόπιστες. αναπροσαρμοσμένη βαθμολογία βασίζεται μόνο στις κριτικές που πιστεύουμε ότι είναι αξιόπιστες.]]> @@ -2258,8 +2212,6 @@ Εμφάνιση διαφημίσεων στον έλεγχο κριτικών - Θα βλέπετε περιστασιακά διαφημίσεις για σχετικά προϊόντα. Όλες οι διαφημίσεις πρέπει να πληρούν τα πρότυπά μας για την ποιότητα των κριτικών. %s - Θα βλέπετε περιστασιακά διαφημίσεις για σχετικά προϊόντα. Διαφημίζουμε μόνο προϊόντα με αξιόπιστες κριτικές. %s Μάθετε περισσότερα @@ -2282,23 +2234,23 @@ Όταν αυτό το προϊόν λάβει περισσότερες κριτικές, θα μπορέσουμε να ελέγξουμε την ποιότητά τους. - Το προϊόν δεν είναι διαθέσιμο + Το προϊόν δεν είναι διαθέσιμο - Εάν παρατηρήσετε ότι αυτό το προϊόν είναι ξανά σε απόθεμα, αναφέρετέ το σε μας και θα αρχίσουμε τον έλεγχο των κριτικών. + Εάν παρατηρήσετε ότι αυτό το προϊόν είναι ξανά σε απόθεμα, αναφέρετέ το σε μας και θα αρχίσουμε τον έλεγχο των κριτικών. - Αναφέρετε ότι το προϊόν είναι ξανά σε απόθεμα - - Αναφέρετε ότι το προϊόν είναι σε απόθεμα + Αναφέρετε ότι το προϊόν είναι σε απόθεμα - Έλεγχος ποιότητας κριτικής + Έλεγχος ποιότητας κριτικής - Έλεγχος ποιότητας κριτικής + Έλεγχος ποιότητας κριτικής + + Έλεγχος ποιότητας κριτικής (%s) Αυτό μπορεί να διαρκέσει περίπου 60 δευτερόλεπτα. - Ευχαριστούμε για την αναφορά! + Ευχαριστούμε για την αναφορά! - Θα έχουμε πληροφορίες για τις κριτικές αυτού του προϊόντος εντός 24 ωρών. Παρακαλούμε ελέγξτε ξανά. + Θα έχουμε πληροφορίες για τις κριτικές αυτού του προϊόντος εντός 24 ωρών. Παρακαλούμε ελέγξτε ξανά. Δεν μπορούμε να ελέγξουμε αυτές τις κριτικές @@ -2336,17 +2288,17 @@ Μάθετε περισσότερα - Επιλέγοντας «Έναρξη δοκιμής», αποδέχεστε την %2$s και τους %3$s του %1$s, που παρέχεται από τη Mozilla. + Επιλέγοντας «Έναρξη δοκιμής», αποδέχεστε την %2$s και τους %3$s του %1$s, που παρέχεται από τη Mozilla. - Επιλέγοντας «Έναρξη δοκιμής», συμφωνείτε με τα ακόλουθα από το %1$s: + Επιλέγοντας «Έναρξη δοκιμής», συμφωνείτε με τα ακόλουθα από το %1$s: - πολιτική απορρήτου + πολιτική απορρήτου - Πολιτική απορρήτου + Πολιτική απορρήτου - όρους χρήσης + όρους χρήσης - Όροι χρήσης + Όροι χρήσης Έναρξη δοκιμής @@ -2382,6 +2334,9 @@ Ανταγωνισμός + + «%s» + σύμπτυξη @@ -2399,4 +2354,195 @@ άνοιγμα συνδέσμου για περισσότερες πληροφορίες %s, Επικεφαλίδα + + + Σύνδεσμοι + + + + + + Μετάφραση σελίδας; + + Ιδιωτικές μεταφράσεις στο %1$s + + Για το απόρρητό σας, οι μεταφράσεις δεν φεύγουν ποτέ από τη συσκευή σας. Σύντομα έρχονται νέες γλώσσες και βελτιώσεις! %1$s + + Μάθετε περισσότερα + + Μετάφραση από + + Μετάφραση σε + + Όχι τώρα + + Τέλος + + Μετάφραση + + Δοκιμή ξανά + + Μετάφραση + + Μετάφραση σε εξέλιξη + + + Προέκυψε πρόβλημα με τη μετάφραση. Παρακαλούμε δοκιμάστε ξανά. + + Μάθετε περισσότερα + + + + Επιλογές μετάφρασης + + Να γίνεται πάντα πρόταση για μετάφραση + + Πάντα μετάφραση για τα %1$s + + Ποτέ μετάφραση για τα %1$s + + Να μη μεταφράζεται ποτέ αυτός ο ιστότοπος + + Ρυθμίσεις μεταφράσεων + + Σχετικά με τις μεταφράσεις στο %1$s + + + + Μεταφράσεις + + Πρόταση για μετάφραση όταν είναι δυνατή + + Πάντα λήψη γλωσσών στη λειτουργία εξοικονόμησης δεδομένων + + Προτιμήσεις μετάφρασης + + Αυτόματη μετάφραση + + Να μη μεταφράζονται ποτέ αυτοί οι ιστότοποι + + Λήψη γλωσσών + + + + Αυτόματη μετάφραση + + + Επιλέξτε μια γλώσσα για να διαχειριστείτε τις προτιμήσεις «πάντα μετάφραση» και «ποτέ μετάφραση». + + + + Πρόταση για μετάφραση (προεπιλογή) + + + Το %1$s θα προτείνει τη μετάφραση ιστοτόπων σε αυτήν τη γλώσσα. + + Πάντα μετάφραση + + Το %1$s θα μεταφράσει αυτόματα αυτήν τη γλώσσα όταν φορτωθεί η σελίδα. + + Ποτέ μετάφραση + + Το %1$s δεν θα προτείνει ποτέ τη μετάφραση ιστοτόπων σε αυτήν τη γλώσσα. + + + + Να μη μεταφράζονται ποτέ αυτοί οι ιστότοποι + + Για να προσθέσετε νέο ιστότοπο: Επισκεφτείτε τον και επιλέξτε «Να μη μεταφράζεται ποτέ αυτός ο ιστότοπος» από το μενού μετάφρασης. + + Αφαίρεση %1$s + + Διαγραφή του %1$s; + + Διαγραφή + + Ακύρωση + + + + Λήψη γλωσσών + + Κάντε λήψη ολόκληρων των γλωσσών για πιο γρήγορες μεταφράσεις και εκτός σύνδεσης. %1$s + + Μάθετε περισσότερα + + Διαθέσιμες γλώσσες + + απαιτείται + + %1$s (%2$s) + + Λήψη γλωσσών + + Όλες οι γλώσσες + + Διαγραφή + + Σε εξέλιξη + + Λήψη + + Επιλεγμένο + + + Διαγραφή της γλώσσας «%1$s» (%2$s); + + Αν διαγράψετε αυτήν τη γλώσσα, το %1$s θα κάνει μερική λήψη των γλωσσών στην προσωρινή μνήμη κατά τη μετάφραση. + + Διαγραφή όλων των γλωσσών (%1$s); + + Αν διαγράψετε όλες τις γλώσσες, το %1$s θα κάνει μερική λήψη των γλωσσών στην προσωρινή μνήμη κατά τη μετάφραση. + + Διαγραφή + + Ακύρωση + + + Λήψη στη λειτουργία εξοικονόμησης δεδομένων (%1$s); + + Κάνουμε μερική λήψη των γλωσσών στην προσωρινή μνήμη για να παραμείνουν ιδιωτικές οι μεταφράσεις. + + Πάντα λήψη στη λειτουργία εξοικονόμησης δεδομένων + + Λήψη + + Λήψη και μετάφραση + + Ακύρωση + + + + Εργαλεία εντοπισμού σφαλμάτων + + Πλοήγηση προς τα πίσω + + Εργαλεία καρτελών + + Αριθμός καρτελών + + Ενεργές + + Ανενεργές + + Ιδιωτικές + + Σύνολο + + Προσθήκη στις ενεργές καρτέλες + + Προσθήκη στις ανενεργές καρτέλες + + Προσθήκη στις ιδιωτικές καρτέλες diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 6e1ceea21857..ee50fae2387f 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -68,11 +68,6 @@ Leave no traces on this device - - %1$s deletes your cookies, history, and site data when you close all your private windows. %2$s Find in page + + Translate page Save to collection @@ -328,14 +325,8 @@ Not now - - Make Firefox your go-to browser We love keeping you safe - - Firefox puts people over profits and defends your privacy by blocking cross-site trackers.\n\nLearn more in our privacy notice. Our non-profit backed browser helps stop companies from secretly following you around the web.\n\nLearn more in our privacy notice. Not now - Hop from phone to laptop and back - Stay encrypted when you hop between devices - - Grab tabs and passwords from your other devices to pick up where you left off. When you’re signed in and synchronised, you’re safer. Firefox encrypts your passwords, bookmarks, and more. @@ -358,15 +345,9 @@ Sign in Not now - - Notifications help you do more with Firefox Notifications help you stay safer with Firefox - - Send tabs between devices, manage downloads, and get tips on getting the most out of Firefox. Securely send tabs between your devices and discover other privacy features in Firefox. @@ -408,8 +389,6 @@ Select one - Manage search shortcuts - Manage alternative search engines Edit engines visible in the search menu @@ -423,8 +402,6 @@ Search engines Suggestions from search engines - - Address bar Address bar preferences @@ -546,14 +523,10 @@ However, it’s also possible that an attacker is involved. If you continue to the web site, you should not enter any sensitive info. If you continue, HTTPS-Only mode will be turned off temporarily for the site. Accessibility - - Custom Firefox Account server Custom Mozilla account server Custom Sync server - - Firefox Account/Sync server modified. Quitting the application to apply changes… Mozilla account/Sync server modified. Quitting the application to apply changes… @@ -572,8 +545,6 @@ Sign in to synchronise tabs, bookmarks, passwords, and more. - Firefox Account - Mozilla account Reconnect to resume synchronising @@ -585,8 +556,6 @@ Data collection Remote debugging via USB - - Show search engines Show search suggestions @@ -717,12 +686,6 @@ Explore add-ons - - - Add-on is not supported - - Add-on is already installed - Add-ons are temporarily disabled @@ -1356,6 +1319,11 @@ Close private tabs + + + Close private tabs? + Tap or swipe this notification to close private tabs. + Marketing @@ -1590,6 +1558,8 @@ All cookies (will cause web sites to break) Isolate cross-site cookies + + Tell web sites not to share & sell data Tracking Content @@ -1926,28 +1896,18 @@ Add new search engine Edit search engine - - Add - - Save Edit Delete - - Other Name - - Name Search engine name Search string URL - Search string to use - URL to use for search Replace query with “%s”. Example:\nhttps://www.google.com/search?q=%s @@ -2176,8 +2136,6 @@ - Review checker - Review Checker Reliable reviews @@ -2190,7 +2148,9 @@ Adjusted rating - Unreliable reviews removed + Unreliable reviews removed + + Based on reliable reviews Highlights from recent reviews @@ -2201,14 +2161,10 @@ letter grade from A to F.]]> Reliable reviews. We believe the reviews are likely from real customers who left honest, unbiased reviews. - - We believe the reviews to be reliable. We believe there’s a mix of reliable and unreliable reviews. Unreliable reviews. We believe the reviews are likely fake or from biased reviewers. - - We believe the reviews are unreliable. adjusted rating is based only on reviews we believe to be reliable.]]> @@ -2224,8 +2180,6 @@ Show ads in review checker - You’ll see occasional ads for relevant products. All ads must meet our review quality standards. %s - You’ll see occasional ads for relevant products. We only advertise products with reliable reviews. %s Learn more @@ -2248,23 +2202,23 @@ When this product has more reviews, we’ll be able to check their quality. - Product is not available + Product is not available - If you see this product is back in stock, report it and we’ll work on checking the reviews. + If you see this product is back in stock, report it and we’ll work on checking the reviews. - Report this product is back in stock - - Report product is in stock + Report product is in stock - Checking review quality + Checking review quality - Checking review quality + Checking review quality + + Checking review quality (%s) This could take about 60 seconds. - Thanks for reporting! + Thanks for reporting! - We should have info about this product’s reviews within 24 hours. Please check back. + We should have info about this product’s reviews within 24 hours. Please check back. We can’t check these reviews @@ -2302,17 +2256,17 @@ Learn more - By selecting “Yes, try it” you agree to %1$s by Mozilla’s %2$s and %3$s. + By selecting “Yes, try it” you agree to %1$s by Mozilla’s %2$s and %3$s. - By selecting “Yes, try it” you agree to the following from %1$s: + By selecting “Yes, try it” you agree to the following from %1$s: - privacy policy + privacy policy - Privacy policy + Privacy policy - terms of use + terms of use - Terms of use + Terms of use Yes, try it @@ -2348,6 +2302,9 @@ Competitiveness + + “%s” + collapse @@ -2365,4 +2322,203 @@ open link to learn more %s, Heading + + + Links + + Links available + + + + + + Translate this page? + + Try private translations in %1$s + + For your privacy, translations never leave your device. New languages and improvements coming soon! %1$s + + Learn more + + Translate from + + Translate to + + Not now + + Done + + Translate + + Try again + + Translating + + Translation in Progress + + + There was a problem translating. Please try again. + + Couldn’t load languages. Check your internet connection and try again. + + Sorry, we don’t support %1$s yet. + + Learn more + + + + Translation Options + + Always offer to translate + + Always translate %1$s + + Never translate %1$s + + Never translate this site + + Translation settings + + About translations in %1$s + + + + Translations + + Offer to translate when possible + + Always download languages in data saving mode + + Translation preferences + + Automatic translation + + Never translate these sites + + Download languages + + + + Automatic translation + + Select a language to manage ”always translate“ and ”never translate“ preferences. + + + + Offer to translate (default) + + %1$s will offer to translate sites in this language. + + Always translate + + %1$s will translate this language automatically when the page loads. + + Never translate + + %1$s will never offer to translate sites in this language. + + + + Never translate these sites + + To add a new site: Visit it and select “Never translate this site” from the translation menu. + + Remove %1$s + + Delete %1$s? + + Delete + + Cancel + + + + Download Languages + + Download complete languages for faster translations and to translate offline. %1$s + + Learn more + + Available languages + + required + + %1$s (%2$s) + + Download Languages + + All languages + + Delete + + In progress + + Download + + Selected + + + Delete %1$s (%2$s)? + + If you delete this language, %1$s will download partial languages to your cache as you translate. + + Delete all languages (%1$s)? + + If you delete all languages, %1$s will download partial languages to your cache as you translate. + + Delete + + Cancel + + + Download while in data saving mode (%1$s)? + + We download partial languages to your cache to keep translations private. + + Always download in data saving mode + + Download + + Download and translate + + Cancel + + + + Debug Tools + + Navigate backwards + + Tab Tools + + Tab count + + Active + + Inactive + + Private + + Total + + Tab creation tool + + Tab quantity to create + + Add to active tabs + + Add to inactive tabs + + Add to private tabs diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 7092f7d6a1a0..c6e506bc8237 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -66,11 +66,6 @@ Lasu neniun spuron en tiu ĉi aparato - - %1$s forigos viajn kuketojn, historion kaj retejajn datumojn kiam vi fermos ĉiujn viajn privatajn fenestrojn. %2$s Serĉi en paĝo + + Traduki paĝon Konservi en kolekto @@ -325,14 +322,8 @@ Ne nun - - Igu Firefox via norma retumilo Ni amas teni vin sekura - - Firefox metas personojn antaŭ profiton kaj defendas vian privatecon per blokado de interretejaj spuriloj.\n\nPli da informo en niaj notoj pri privateco. Nia retumilo, subtenata de nenprofitcela organizo, helpas eviti ke entreprenoj kaŝe sekvu vin tra la reto.\n\nPli da informo en nia rimarko pri privateco. Ne nun - Iru tien kaj reen inter la telefono kaj la komputilo - Restu protektita dum vi iras tien kaj reen inter aparatoj, danke al ĉifrado - - Prenu viajn langetojn kaj pasvortojn el viaj aliaj aparatoj por daŭrigi el la loko kie vi haltis. Komencinte seancon kaj spegulinte, vi estas pli sekura. Firefox ĉifras viajn pasvortojn, legosignojn kaj pli. @@ -355,15 +342,9 @@ Komenci seancon Ne nun - - Sciigoj helpas vin plenumi pli per Firefox Sciigoj helpas vin resti sekura kun Firefox - - Sendu langetojn inter aparatoj, administru elŝutojn kaj ricevu konsiletojn pri la maniero eltiri la maksimumon el Firefox. Sekure sendu langetojn inter viaj aparatoj kaj malkovru aliajn privatecajn trajtojn en Firefox. @@ -405,8 +386,6 @@ Elektu serĉilon - Administri serĉajn ŝparvojojn - Administri alternativajn serĉilojn Modifi la videblan liston de serĉiloj en la serĉa menuo @@ -420,8 +399,6 @@ Serĉiloj Sugestoj el serĉiloj - - Adresa strio Preferoj por la adresa strio @@ -519,6 +496,12 @@ Permesi + + %1$s ĵus rifuzis kuketojn por vi + + + Malpli da distro, malpli da kuketoj klopodante spuri vin en tiu ĉi retejo. + Aŭtomate provi konekti al retejoj per la ĉifrita protokolo HTTPS por pliigi sekurecon. @@ -541,14 +524,10 @@ Tamen ankaŭ eblas, ke iu provas interkapti viajn datumojn. Se vi daŭrigas, ne enigu iun ajn privatan datumon, cetere la HTTPS-nura reĝimo estos portempe malŝaltita por la vizitota retejo. Alirebleco - - Personecigita servilo de konto de Firefox Personecigita servilo de konto de Mozilla Personecigita servilo de spegulado - - La serviloj de Konto de Firefox Account/Spegulado estis ŝanĝitaj. La programo nun finiĝos por apliki la ŝanĝojn… La agordoj de konto de Mozilla aŭ de spegulado ŝanĝiĝis. Apo finiĝas por apliki la ŝanĝojn… @@ -566,8 +545,6 @@ Komencu seancon por speguli langetojn, legosignojn, pasvortojn kaj pli. - Konto de Firefox - Konto de Mozilla Rekonektiĝu por daŭrigi la speguladon @@ -579,8 +556,6 @@ Kolektado de datumoj Fora sencimigo per USB - - Montri serĉilojn Montri serĉajn sugestojn @@ -628,6 +603,8 @@ Aldonaĵoj + + Instali aldonaĵon el dosiero Sciigoj @@ -710,12 +687,6 @@ Esplori aldonaĵojn - - - Nesubtenata aldonaĵo - - La aldonaĵo jam estas instalita - La aldonaĵoj estas provizore malaktivigitaj @@ -1358,6 +1329,10 @@ Fermi privatajn langetojn + + Ĉu fermi privatajn langetojn? + Tuŝetu aŭ ŝovu tiun ĉi sciigon por fermi privatajn langetojn. + Merkatiko @@ -1598,6 +1573,8 @@ Ĉiuj kuketoj (tio misfunkciigos retejojn) Izoli interretejajn kuketojn + + Peti al retejoj ne dividi aŭ vendi miajn datumojn Spurila enhavo @@ -1936,29 +1913,19 @@ Aldoni novan serĉilon Modifi serĉilon - - Aldoni - - Konservi Modifi Forigi - - Aliaj Nomo - - Nomo Nomo de serĉilo Serĉa URL - Teksto por serĉi - URL uzota por serĉoj Anstataŭigi la serĉotan tekston per “%s”. Ekzemple:\nhttps://www.google.com/search?q=%s @@ -2190,8 +2157,6 @@ - Kontrolilo de recenzoj - Kontrolilo de recenzoj Fidindaj recenzoj @@ -2204,7 +2169,9 @@ Alĝustigita taksado - Nefidindaj recenzoj forigitaj + Nefidindaj recenzoj forigitaj + + Bazita sur fidindaj recenzoj Elstaraĵoj el ĵusaj recenzoj @@ -2216,14 +2183,10 @@ literan noton el A ĝis F.]]> Fidindaj recenzoj. Ni pensas ke tiuj venas el verŝajnaj veraj klientoj, kiuj donis sincerajn kaj objektivajn recenzojn. - - Ni pensas ke tiuj recenzoj estas fidindaj. Ni pensas ke estas miksaĵo de findindaj kaj nefidindaj recenzoj. Nefidindaj recenzoj. Ni pensas ke tiuj estas verŝajne ĉu malveraj ĉu donitaj de neobjektivaj recenzintoj. - - Ni pensas ke tiuj recenzoj estas nefidindaj. alĝustigita taksado estas bazita nur sur la recenzoj, kiujn ni opinias fidindaj.]]> @@ -2239,8 +2202,6 @@ Montri reklamojn en la kontrolilo de recenzoj - De tempo al tempo vi vidos reklamojn por elstaraj produktoj. Ĉiuj reklamoj devas konformi al niaj normoj pri kvalito de recenzoj. %s - De tempo al tempo vi vidos reklamojn por elstaraj produktoj. Ni nur reklamas produktojn kun fidindaj recenzoj. %s Pli da informo @@ -2251,8 +2212,6 @@ Reklamo de %s - La kontrolilo de reklamoj funkcias danke al %s. - La kontrolilo de reklamoj funkcias danke al %s %s de Mozilla @@ -2265,23 +2224,23 @@ Kiam tiu ĉi produko havos pli da recenzoj, ni povis kontroli ĝian kvaliton. - Nedisponebla produkto + Nedisponebla produkto - Se vi vidas ke denove estas stoko de tiu ĉi produko, raportu tion kaj ni kontrolos la recenzojn. + Se vi vidas ke denove estas stoko de tiu ĉi produko, raportu tion kaj ni kontrolos la recenzojn. - Raporti ke denove estas stoko de tiu ĉi produkto - - Raporti ke denove estas stoko de tiu ĉi produkto + Raporti ke denove estas stoko de tiu ĉi produkto - Kvalito de recenzoj estas taksata + Kvalito de recenzoj estas taksata - Kvalito de recenzoj estas taksata + Kvalito de recenzoj estas taksata + + Kvalito de recenzoj estas taksata (%s) Tio povas postuli proksimume 60 sekundojn. - Dankon pro la raporto! + Dankon pro la raporto! - Ni devus havi informojn pri la recenzoj de tiu ĉi produkto dum la venontaj 24 horoj. Bonvolu rekontroli baldaŭ. + Ni devus havi informojn pri la recenzoj de tiu ĉi produkto dum la venontaj 24 horoj. Bonvolu rekontroli baldaŭ. Ni ne povas kontroli tiujn recenzojn @@ -2312,23 +2271,25 @@ Provu nian fidindan gvidadon al recenzoj de produktoj Vidu kiel fidindaj estas la recenzoj en %1$s antaŭ ol aĉeti. La kontrolilo de recenzoj, eksperimenta trajto de %2$s, estas integrita en la retumilo kaj ĝi ankaŭ funkcias en %3$s kaj %4$s. + + Vidu kiel fidindaj estas la recenzoj en %1$s antaŭ ol aĉeti. La kontrolilo de recenzoj, eksperimenta trajto de %2$s, estas integrita en la retumilo. Danke al la povo de %1$s de Mozilla, ni helpas vin eviti neobjektivajn kaj malverajn recenzojn. Nia modelo de artefarita intelekto konstante pliboniĝas por protekti vin dum vi aĉetumas. %2$s Pli da informo - Se vi elektas “Jes, provi ĝin” vi akceptas la %2$s kaj %3$s de %1$s de Mozilla. + Se vi elektas “Jes, provi ĝin” vi akceptas la %2$s kaj %3$s de %1$s de Mozilla. - Se vi elektas “Jes, provi ĝin” vi akceptas la jenon el %1$s: + Se vi elektas “Jes, provi ĝin” vi akceptas la jenon el %1$s: - politiko pri privateco + politiko pri privateco - Politiko pri privateco + Politiko pri privateco - kondiĉoj de uzo + kondiĉoj de uzo - Kondiĉoj de uzo + Kondiĉoj de uzo Jes, provi ĝin @@ -2364,6 +2325,9 @@ Konkurenceco + + “%s” + faldi @@ -2379,4 +2343,136 @@ legi la artikolon malfermu ligilon por pli da informo - + + + %s, Kaptitolo + + Ligiloj + + Disponeblaj ligiloj + + + + + + Ĉu traduki ĉi tiun paĝon? + + Provu privatajn tradukojn en %1$s + + Por protekti vian privatecon, tradukoj neniam forlasas vian aparaton. Baldaŭ estos novaj lingvoj kaj plibonigoj! %1$s + + Pli da informo + + Traduki el + + Traduki en + + Ne nun + + Farita + + Traduki + + Klopodi denove + + Traduko + + Traduko okazas + + Okazis problemo dum traduko. Bonvolu provi denove. + + Ne eblis ŝargi lingvojn. Kontrolu vian retaliron kaj provu denove. + + Bedaŭrinde ni ankoraŭ ne subtenas %1$s. + + Pli da informo + + + + Tradukaj elektebloj + + Ĉiam proponi tradukon + + Ĉiam traduki %1$s + + Neniam traduki %1$s + + Neniam traduki tiun ĉi retejon + + Tradukaj agordoj + + Pri tradukoj en %1$s + + + + Tradukoj + + Proponi tradukon kiam tio eblas + + Ĉiam elŝuti lingvoj en datumŝpara reĝimo + + Preferoj pri traduko + + Aŭtomata traduko + + Neniam traduki tiujn ĉi retejojn + + Elŝuti lingvojn + + + + Aŭtomata traduko + + Elekti lingvon por la preferoj ”ĉiam traduki” kaj ”neniam traduki”. + + + + Proponi traduki (normo) + + + %1$s proponos traduki retejojn el tiu ĉi lingvo. + + Ĉiam traduki + + %1$s tradukos el ĉi lingvo aŭtomate dum ŝargado de la paĝo. + + Neniam traduki + + %1$s neniam proponos traduki retejojn el tiu ĉi lingvo. + + + + Neniam traduki tiujn ĉi retejojn + + Por aldoni novan retejon: vizitu ĝin kaj elektu “neniam traduki tiun ĉi retejon” el la traduka menuo. + + Forigi %1$s + + Ĉu forigi %1$s? + + Forigi + + Nuligi + + + + Elŝuti lingvojn + + Elŝuti tutajn lingvojn por pli rapidaj tradukoj kaj por traduki malkonektite. %1$s + + Pli da informo + + Disponeblaj lingvoj + + postulata + + + %1$s (%2$s) + + Elŝuti lingvojn + + diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml index 7a831c2c3e9e..529ed68a2987 100644 --- a/app/src/main/res/values-es-rAR/strings.xml +++ b/app/src/main/res/values-es-rAR/strings.xml @@ -69,11 +69,6 @@ No dejés rastros en este dispositivo - - %1$s borra tus cookies, historial y datos del sitio cuando cerrás todas tus ventanas privadas. %2$s Buscar en la página + + Traducir página Guardar en la colección @@ -337,14 +334,8 @@ No ahora - - Hacé de Firefox tu navegador favorito Nos encanta mantenerte seguro - - Firefox pone a las personas por encima de las ganancias y defiende tu privacidad bloqueando los rastreadores entre sitios.\n\nMás información en nuestra nota de privacidad. Nuestro navegador respaldado sin fines de lucro ayuda a evitar que las empresas te sigan en secreto por la web.\n\nMás información en nuestro aviso de privacidad. No ahora - Cambiá de teléfono a computadora y viceversa - Mantenete cifrado cuando cambies entre dispositivos - - Traé las pestañas y contraseñas de tus otros dispositivos para continuar donde lo habías dejado. Cuando iniciaste la sesión y estás sincronizado, estás más seguro. Firefox cifra tus contraseñas, marcadores y más. @@ -367,15 +354,9 @@ Iniciar sesión No ahora - - Las notificaciones te ayudan a hacer más con Firefox Las notificaciones te ayudan a mantenerte más seguro con Firefox - - Enviá pestañas entre dispositivos, administrá descargas y recibí consejos para sacar el máximo provecho de Firefox. Enviá pestañas entre dispositivos de forma segura y descubrí otras funciones de privacidad de Firefox. @@ -417,8 +398,6 @@ Seleccioná uno - Administrar atajos de búsqueda - Administrar buscadores alternativos Editar buscadores visibles en el menú de búsqueda @@ -432,8 +411,6 @@ Buscadores Sugerencias de buscadores - - Barra de direcciones Preferencias de la barra de direcciones @@ -555,14 +532,10 @@ Sin embargo, también es posible que un atacante esté involucrado. Si continúa al sitio web, no debe ingresar ninguna información sensible. Si continúa, el modo solo HTTPS se desactivará temporalmente para el sitio. Accesibilidad - - Servidor personalizado de cuenta de Firefox Servidor personalizado de cuenta de Mozilla Servidor personalizado de Sync - - Los servidores de cuenta de Firefox y Sync fueron modificados. Cerrando la aplicación para aplicar los cambios… Cuenta de Mozilla/servidor de Sync modificados. Saliendo de la aplicación para aplicar cambios… @@ -580,8 +553,6 @@ Iniciá la sesión para sincronizar pestañas, marcadores, contraseñas y más. - Cuenta Firefox - Cuenta de Mozilla Reconectar para reanudar la sincronización @@ -593,8 +564,6 @@ Recopilación de datos Depuración remota vía USB - - Mostrar buscadores Mostrar sugerencias de búsqueda @@ -726,12 +695,6 @@ Explorar complementos - - - El complemento no es compatible - - El complemento ya está instalado - Los complementos están deshabilitados temporalmente @@ -1383,6 +1346,11 @@ Cerrar pestañas privadas + + + ¿Cerrar pestañas privadas? + Tocá o deslizá esta notificación para cerrar las pestañas privadas. + Marketing @@ -1621,6 +1589,8 @@ Todas las cookies (va a causar errores en los sitios web) Aislar cookies de sitios cruzados + + Decirle a los sitios web que no compartan ni vendan datos Contenido de rastreo @@ -1891,7 +1861,7 @@ Se debe completar este campo - Desbloqueá para ver los inicios de sesión guardados + Desbloqueá para ver las tarjetas guardadas Asegurá tus tarjetas de crédito @@ -1960,28 +1930,18 @@ Agregar un nuevo buscador Agregar buscador - - Agregar - - Guardar Editar Eliminar - - Otro Nombre - - Nombre Nombre del buscador URL de la cadena de búsqueda - Cadena de búsqueda para usar - URL a usar para la búsqueda Reemplazar la consulta con "%s". Ejemplo:\n https://www.google.com/search?q=%s @@ -2213,8 +2173,6 @@ - Verificador de revisiones - Verificador de revisiones Revisiones confiables @@ -2227,7 +2185,9 @@ Calificación ajustada - Revisiones no confiables eliminadas + Revisiones no confiables eliminadas + + Basado en revisiones confiables Destacados de revisiones recientes @@ -2238,14 +2198,10 @@ calificación con letras de la A a la F.]]> Revisiones confiables. Creemos que las revisiones probablemente provengan de clientes reales que dejaron revisiones honestas e imparciales. - - Creemos que las revisiones son confiables. Creemos que hay una mezcla de revisiones confiables y no confiables. Revisiones poco fiables. Creemos que las revisiones probablemente sean falsas o provengan de revisores sesgados. - - Creemos que las revisiones no son confiables. calificación ajustada se basa únicamente en revisiones que consideramos confiables.]]> @@ -2261,8 +2217,6 @@ Mostrar publicidad en el verificador de revisiones - Verás publicidades ocasionales de productos relevantes. Todos los anuncios deben cumplir con nuestros estándares de calidad de revisiones. %s - Verás anuncios ocasionales de productos relevantes. Solo anunciamos productos con revisiones confiables. %s Conocer más @@ -2285,23 +2239,23 @@ Cuando este producto tenga más revisiones, podremos verificar su calidad. - Producto no disponible + Producto no disponible - Si ves que este producto está nuevamente en stock, informanos y trabajaremos en verificar las revisiones. + Si ves que este producto está nuevamente en stock, informanos y trabajaremos en verificar las revisiones. - Informar que este producto vuelve a estar en stock - - Informar que el producto está en stock + Informar que el producto está en stock - Verificando la calidad de la revisión + Verificando la calidad de la revisión - Verificando la calidad de la revisión + Verificando la calidad de la revisión + + Verificando la calidad de la revisión (%s) Esto puede tardar unos 60 segundos. - ¡Gracias por informarnos! + ¡Gracias por informarnos! - Deberíamos tener información sobre las revisiones de este producto en las próximas 24 horas. Volvé a chequear. + Deberíamos tener información sobre las revisiones de este producto en las próximas 24 horas. Volvé a chequear. No podemos comprobar estas revisiones @@ -2339,17 +2293,17 @@ Conocer más - Al seleccionar “Si, probarlo” Estás de acuerdo con %1$s de Mozilla %2$s y %3$s. + Al seleccionar “Si, probarlo” Estás de acuerdo con %1$s de Mozilla %2$s y %3$s. - Al seleccionar “Sí, probarlo” aceptás lo siguiente de %1$s: + Al seleccionar “Sí, probarlo” aceptás lo siguiente de %1$s: - política de privacidad + política de privacidad - Política de privacidad + Política de privacidad - términos de uso + términos de uso - Términos de uso + Términos de uso Sí, probarlo @@ -2385,6 +2339,9 @@ Competitividad + + “%s” + contraer @@ -2402,4 +2359,205 @@ abrir enlace para conocer más %s, encabezado + + + Enlaces + + Enlaces disponibles + + + + + + ¿Traducir esta página? + + Probar traducciones privadas en %1$s + + Para tu privacidad, las traducciones nunca salen de tu dispositivo. ¡Nuevos idiomas y mejoras próximamente! %1$s + + Conocer más + + Traducir de + + Traducir a + + No ahora + + Listo + + Traducir + + Intentar nuevamente + + Traduciendo + + Traducción en proceso + + + Hubo un problema al traducir. Probá de nuevo. + + No se pudieron cargar los idiomas. Verificá tu conexión a Internet y probá de nuevo. + + Lo sentimos, todavía no soportamos %1$s. + + Conocer más + + + + Opciones de traducción + + Siempre ofrecer la traducción + + Siempre traducir %1$s + + Nunca traducir %1$s + + Nunca traducir este sitio + + Configuración de traducción + + + Acerca de las traducciones en %1$s + + + + Traducciones + + Ofrecer traducir cuando sea posible + + Descargar siempre idiomas en modo de ahorro de datos + + Preferencias de traducción + + Traducción automática + + Nunca traducir estos sitios + + Descargar idiomas + + + + Traducción automática + + Seleccioná un idioma para administrar las preferencias de ”traducir siempre“ y ”nunca traducir“. + + + + Ofrecer traducción (predeterminado) + + %1$s ofrecerá traducir sitios en este idioma. + + Traducir siempre + + %1$s traducirá este idioma automáticamente cuando se cargue la página. + + Nunca traducir + + + %1$s nunca ofrecerá traducir sitios en este idioma. + + + + Nunca traducir estos sitios + + Para agregar un nuevo sitio: visitalo y seleccioná “Nunca traducir este sitio” en el menú de traducción. + + Eliminar %1$s + + ¿Eliminar %1$s? + + Borrar + + Cancelar + + + + Descargar idiomas + + Descargar idiomas completos para traducciones más rápidas y sin conexión. %1$s + + Conocer más + + Idiomas disponibles + + requerido + + %1$s (%2$s) + + Descargar idiomas + + Todos los idiomas + + Borrar + + En proceso + + Descargar + + Seleccionado + + + ¿Borrar %1$s (%2$s)? + + Si borrás este idioma, %1$s descargará idiomas parcialmente al caché mientras se traduce. + + ¿Borrar todos los idiomas (%1$s)? + + Si borrás todos los idiomas, %1$s descargará idiomas parcialmente al caché mientras se traduce. + + Borrar + + Cancelar + + + ¿Descargar en modo de ahorro de datos (%1$s)? + + Descargamos idiomas parcialmente al caché para mantener las traducciones privadas. + + Descargar siempre en modo de ahorro de datos + + Descargar + + Descargar y traducir + + Cancelar + + + + Herramientas de depuración + + Navegar hacia atrás + + Herramientas de pestañas + + Cantidad de pestañas + + Activa + + Inactiva + + Privada + + Total + + Herramienta de creación de pestañas + + Cantidad de pestañas a crear + + Agregar a pestañas activas + + Agregar a pestañas inactivas + + Agregar a pestañas privadas diff --git a/app/src/main/res/values-es-rCL/strings.xml b/app/src/main/res/values-es-rCL/strings.xml index fec0726c1dce..c32574558bff 100644 --- a/app/src/main/res/values-es-rCL/strings.xml +++ b/app/src/main/res/values-es-rCL/strings.xml @@ -68,11 +68,6 @@ No dejes rastros en este dispositivo - - %1$s elimina tus cookies, historial y datos del sitio cuando cierras todas tus ventanas privadas. %2$s - - Haz de Firefox tu navegador para todo Nos encanta mantenerte a salvo - - Firefox pone a las personas por encima de las ganancias y defiende tu privacidad al bloquear los rastreadores entre sitios.\n\nObtén más información en nuestra política de privacidad. Nuestro navegador respaldado por una organización sin fines de lucro ayuda a evitar que las empresas te sigan en secreto en la web.\n\nObtén más información en nuestro aviso de privacidad. Ahora no - Salta del teléfono al computador y viceversa - Mantén todo cifrado cuando saltes entre dispositivos - - Recupera las pestañas y contraseñas de tus otros dispositivos para continuar desde donde quedaste. Cuando te conectas y sincronizas, estás más seguro. Firefox cifra tus contraseñas, marcadores y más. @@ -359,15 +344,9 @@ Conectarse Ahora no - - Las notificaciones te ayudan a hacer más con Firefox Las notificaciones te ayudan a mantenerte más seguro con Firefox - - Envía pestañas entre dispositivos, administra las descargas y obtén sugerencias para aprovechar Firefox al máximo. Envía pestañas entre dispositivos de forma segura y descubre otras funcionalidades de privacidad de Firefox. @@ -409,8 +388,6 @@ Selecciona uno - Gestionar atajos de búsqueda - Gestionar motores de búsqueda alternativos Editar motores visibles en el menú de búsqueda @@ -424,8 +401,6 @@ Motores de búsqueda Sugerencias de motores de búsqueda - - Barra de direcciones Preferencias de la barra de direcciones @@ -547,14 +522,10 @@ Sin embargo, también es posible que un atacante esté involucrado. Si continúas al sitio web, no debes ingresar ninguna información confidencial. Si continúas, el modo Solo HTTPS se desactivará temporalmente para el sitio. Accesibilidad - - Servidor personalizado de cuenta de Firefox Servidor personalizado de cuenta de Mozilla Servidor personalizado de Sync - - Servidores de cuenta de Firefox y Sync modificados. Cerrando la aplicación para aplicar los cambios… Servidores de cuenta de Mozilla y Sync modificados. Cerrando la aplicación para aplicar los cambios… @@ -573,8 +544,6 @@ Conéctate para sincronizar pestañas, marcadores, contraseñas y más. - Cuenta de Firefox - Cuenta de Mozilla Reconéctate para continuar la sincronización @@ -586,8 +555,6 @@ Recopilación de datos Depuración remota vía USB - - Mostrar motores de búsqueda Mostrar sugerencias de búsqueda @@ -719,12 +686,6 @@ Explorar complementos - - - Complemento no compatible - - Complemento ya está instalado - Los complementos están temporalmente deshabilitados @@ -1594,6 +1555,8 @@ Todas las cookies (hará que los sitios fallen) Aislar cookies de sitios cruzados + + Decir a los sitios web que no vendan ni compartan mis datos Contenido de rastreo @@ -1932,28 +1895,18 @@ Añadir nuevo motor de búsqueda Editar motor de búsqueda - - Añadir - - Guardar Editar Eliminar - - Otro Nombre - - Nombre Nombre del motor de búsqueda Cadena de la URL de búsqueda - Cadena de búsqueda a usar - URL a utilizar para la búsqueda Reemplazar la consulta con “%s”. Ejemplo:\n https://www.google.com/search?q=%s @@ -2182,8 +2135,6 @@ - Verificador de reseñas - Verificador de reseñas Reseñas confiables @@ -2196,7 +2147,9 @@ Calificación ajustada - Se eliminaron las reseñas poco confiables + Se eliminaron las reseñas poco confiables + + Basado en revisiones confiables Aspectos destacados de reseñas recientes @@ -2207,14 +2160,10 @@ calificación con letras de la A a la F.]]> Revisiones confiables. Creemos que las reseñas probablemente provienen de clientes reales que dejaron reseñas honestas e imparciales. - - Creemos que las reseñas son confiables. Creemos que hay una combinación de reseñas confiables y no confiables. Reseñas poco fiables. Creemos que las reseñas probablemente son falsas o provienen de revisores sesgados. - - Creemos que las reseñas no son confiables. calificación ajustada se basa únicamente en reseñas que consideramos confiables.]]> @@ -2230,8 +2179,6 @@ Mostrar anuncios en el verificador de reseñas - Verás anuncios ocasionales de productos relevantes. Todos los anuncios deben cumplir con nuestros estándares de calidad de revisión. %s - Verás anuncios ocasionales de productos relevantes. Solo publicitaremos productos con reseñas confiables. %s Aprender más @@ -2254,24 +2201,24 @@ Cuando este producto tenga más reseñas, podremos revisar su calidad. - El producto no está disponible + El producto no está disponible - Si ves que este producto vuelve a estar disponible, infórmalo y trabajaremos para verificar las reseñas. - - Informar que este producto volvió a estar disponible + Si ves que este producto vuelve a estar disponible, infórmalo y trabajaremos para verificar las reseñas. - Informar que el producto está en stock + Informar que el producto está en stock - Comprobando la calidad de la reseña + Comprobando la calidad de la reseña - Comprobando la calidad de la reseña + Comprobando la calidad de la reseña + + Comprobando la calidad de la reseña (%s) Esto podría tardar unos 60 segundos. - ¡Gracias por informar! + ¡Gracias por informar! - Deberíamos tener información sobre las reseñas de este producto dentro de 24 horas. Por favor, vuelve a revisar más tarde. + Deberíamos tener información sobre las reseñas de este producto dentro de 24 horas. Por favor, vuelve a revisar más tarde. No podemos comprobar estas reseñas @@ -2355,6 +2302,9 @@ Competitividad + + “%s” + contraer @@ -2372,4 +2322,171 @@ abrir enlace para aprender más %s, Cabecera + + + + + + ¿Traducir esta página? + + Prueba traducciones privadas en %1$s + + Para tu privacidad, las traducciones nunca salen de tu dispositivo. ¡Próximamente nuevos idiomas y mejoras! %1$s + + Aprender más + + Traducir desde + + Traducir a + + Ahora no + + Traducir + + Traduciendo + + Traducción en proceso + + + + Opciones de traducción + + Siempre ofrecer la traducción + + Traducir siempre del %1$s + + Nunca traducir del %1$s + + Nunca traducir este sitio + + Ajustes de traducción + + Acerca de las traducciones en %1$s + + + + Traducciones + + Ofrecer traducción cuando sea posible + + Siempre descargar idiomas en el modo de ahorro de datos + + Preferencias de traducción + + Traducción automática + + Nunca traducir estos sitios + + Descargar idiomas + + + + Traducción automática + + Selecciona un idioma para administrar las preferencias de ”traducir siempre“ y ”nunca traducir“. + + + + Ofrecer traducción (predeterminado) + + %1$s ofrecerá traducir sitios en este idioma. + + Traducir siempre + + %1$s traducirá este idioma automáticamente cuando se cargue la página. + + Nunca traducir + + %1$s nunca ofrecerá traducir sitios en este idioma. + + + + Nunca traducir estos sitios + + Para añadir un nuevo sitio: visítalo y selecciona “Nunca traducir este sitio” en el menú de traducción. + + Eliminar %1$s + + ¿Eliminar %1$s? + + Eliminar + + Cancelar + + + + Descargar idiomas + + Descarga idiomas completos para traducciones más rápidas y para traducir sin conexión. %1$s + + Aprender más + + Idiomas disponibles + + requerido + + %1$s (%2$s) + + Descargar idiomas + + Todos los idiomas + + Eliminar + + En proceso + + Descargar + + Seleccionado + + + ¿Eliminar %1$s (%2$s)? + + Si eliminas este idioma, %1$s descargará idiomas parciales a tu caché a medida que traduzcas. + + ¿Eliminar todos los idiomas (%1$s)? + + Si eliminas todos los idiomas, %1$s descargará idiomas parciales a tu caché a medida que traduzcas. + + Borrar + + Cancelar + + + ¿Descargar mientras estás en modo de ahorro de datos (%1$s)? + + Descargamos idiomas parciales a tu caché para mantener las traducciones privadas. + + Siempre descargar en el modo de ahorro de datos + + Descargar + + Descargar y traducir + + Cancelar + + + + Herramientas de pestaña + + Recuento de pestañas + + Activa + + Inactiva + + Privada + + Total diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index ad76654c896c..7c846290f909 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -71,11 +71,6 @@ No dejar rastro en este dispositivo - - %1$s elimina tus cookies, historial y datos del sitio cuando cierras todas tus ventanas privadas. %2$s Buscar en la página + + Traducir página Guardar en la colección @@ -335,14 +332,8 @@ Ahora no - - Haz de Firefox tu navegador favorito Nos encanta mantenerte a salvo - - Firefox antepone las personas al lucro y defiende tu privacidad al bloquear los rastreadores entre sitios.\n\nObtén más información en nuestro aviso de privacidad. Nuestro navegador respaldado por una organización sin ánimo de lucro ayuda a evitar que las empresas te sigan en secreto en la web.\n\nMás información en nuestro aviso de privacidad. Ahora no - Salta del teléfono al ordenador y viceversa - Mantén todo cifrado cuando pases de un dispositivo a otro - - Recupera las pestañas y contraseñas de tus otros dispositivos para continuar desde donde lo habías dejado. Tras iniciar sesión y sincronizar, estás más seguro. Firefox cifra tus contraseñas, marcadores y más. @@ -365,15 +352,9 @@ Iniciar sesión Ahora no - - Las notificaciones te ayudan a hacer más con Firefox Las notificaciones te ayudan a estar más seguro con Firefox - - Envía pestañas entre dispositivos, administra descargas y obtén consejos para obtener el máximo de Firefox. Envía pestañas de forma segura entre tus dispositivos y descubre otras funciones de privacidad en Firefox. @@ -417,8 +398,6 @@ Selecciona uno - Administrar atajos de búsqueda - Administrar buscadores alternativos Editar buscadores visibles en el menú de búsqueda @@ -432,8 +411,6 @@ Buscadores Sugerencias de buscadores - - Barra de direcciones Preferencias de la barra de direcciones @@ -555,14 +532,10 @@ Sin embargo, también es posible que se trate de un atacante. Si continúas en el sitio web, no debes introducir ninguna información sensible. Si continúas, el modo Solo HTTPS se desactivará temporalmente para el sitio. Accesibilidad - - Servidor personalizado de cuenta de Firefox Servidor personalizado de cuenta de Mozilla Servidor personalizado de Sync - - Servidores de cuenta de Firefox y Sync modificados. Cerrando la aplicación para aplicar los cambios… Servidores de cuenta de Mozilla y Sync modificados. Cerrando la aplicación para aplicar los cambios… @@ -580,8 +553,6 @@ Inicia sesión para sincronizar pestañas, marcadores, contraseñas y más. - Cuenta Firefox - Cuenta de Mozilla Reconectar para reanudar la sincronización @@ -593,8 +564,6 @@ Recopilación de datos Depuración remota vía USB - - Mostrar buscadores Mostrar sugerencias de búsqueda @@ -726,12 +695,6 @@ Explorar complementos - - - El complemento no es compatible - - El complemento ya está instalado - Los complementos están desactivados temporalmente @@ -1385,6 +1348,11 @@ Cerrar pestañas privadas + + + ¿Cerrar pestañas privadas? + Toca o desliza esta notificación para cerrar las pestañas privadas. + Marketing @@ -1629,6 +1597,8 @@ Todas las cookies (algunos sitios no funcionarán correctamente) Aislar cookies entre sitios + + Decir a los sitios web que no vendan ni compartan mis datos Contenido de rastreo @@ -1971,29 +1941,19 @@ Añadir nuevo buscador Editar buscador - - Añadir - - Guardar Editar Eliminar - - Otro Nombre - - Nombre Nombre del buscador URL de cadena de búsqueda - Cadena de búsqueda a usar - URL a utilizar para la búsqueda Reemplazar la consulta con “%s”. Ejemplo:\n https://www.google.com/search?q=%s @@ -2223,8 +2183,6 @@ - Verificador de reseñas - Verificador de reseñas Reseñas fiables @@ -2237,7 +2195,9 @@ Calificación ajustada - Se han eliminado las reseñas no fiables + Se han eliminado las reseñas no fiables + + Basado en revisiones fiables Aspectos destacados de reseñas recientes @@ -2248,14 +2208,10 @@ calificación con letras de la A a la F.]]> Revisiones fiables. Creemos que las reseñas probablemente provienen de clientes reales que dejaron reseñas honestas e imparciales. - - Creemos que las reseñas son fiables. Creemos que hay una combinación de reseñas fiables y no fiables. Reseñas poco fiables. Creemos que las reseñas probablemente son falsas o provienen de revisores sesgados. - - Creemos que las reseñas no son fiables. calificación ajustada se basa únicamente en reseñas que consideramos fiables.]]> @@ -2271,8 +2227,6 @@ Mostrar anuncios en el verificador de reseñas - Verás anuncios ocasionales de productos relevantes. Todos los anuncios deben cumplir con nuestros estándares de calidad de revisión. %s - Verá anuncios ocasionales de productos relevantes. Solo anunciamos productos con revisiones fiables. %s Saber más @@ -2295,23 +2249,23 @@ Cuando este producto tenga más reseñas, podremos analizar su calidad. - El producto no está disponible + El producto no está disponible - Si ves que este producto vuelve a estar disponible, infórmanos y trabajaremos para actualizar el análisis. + Si ves que este producto vuelve a estar disponible, infórmanos y trabajaremos para actualizar el análisis. - Informar que este producto vuelve a estar disponible - - Informar que el producto está en stock + Informar que el producto está en stock - Comprobando la calidad de la reseña + Comprobando la calidad de la reseña - Comprobando la calidad de la reseña + Comprobando la calidad de la reseña + + Comprobando la calidad de la reseña (%s) Esto podría tardar unos 60 segundos. - ¡Gracias por informar! + ¡Gracias por informar! - Deberíamos tener información sobre las reseñas de este producto en 24 horas. Por favor, vuelve a comprobarlo más tarde. + Deberíamos tener información sobre las reseñas de este producto en 24 horas. Por favor, vuelve a comprobarlo más tarde. No podemos comprobar estas reseñas @@ -2349,17 +2303,17 @@ Saber más - Al seleccionar “Sí, probarlo”, aceptas %1$s de %2$s y %3$s de Mozilla. + Al seleccionar “Sí, probarlo”, aceptas %1$s de %2$s y %3$s de Mozilla. - Al seleccionar “Sí, probarlo”, aceptas lo siguiente de %1$s: + Al seleccionar “Sí, probarlo”, aceptas lo siguiente de %1$s: - política de privacidad + política de privacidad - Política de privacidad + Política de privacidad - términos de uso + términos de uso - Términos de uso + Términos de uso Si, probarlo @@ -2395,6 +2349,9 @@ Competitividad + + “%s” + contraer @@ -2412,4 +2369,204 @@ abrir enlace para saber más %s, Cabecera + + + Enlaces + + Enlaces disponibles + + + + + + ¿Traducir esta página? + + Probar traducciones privadas en %1$s + + Para tu privacidad, las traducciones nunca salen de tu dispositivo. ¡Nuevos idiomas y mejoras próximamente! %1$s + + Saber más + + Traducir del + + Traducir a + + Ahora no + + Hecho + + Traducir + + Reintentar + + Traduciendo + + Traducción en curso + + + Ha surgido un problema al traducir. Por favor inténtalo de nuevo. + + No se han podido cargar los idiomas. Verifica tu conexión a Internet y prueba de nuevo. + + Lo sentimos, todavía no soportamos %1$s. + + Saber más + + + + Opciones de traducción + + Siempre ofrecer la traducción + + Siempre traducir %1$s + + No traducir nunca %1$s + + No traducir nunca este sitio + + Ajustes de traducción + + Acerca de las traducciones en %1$s + + + + Traducciones + + Ofrecer la traducción cuando sea posible + + Descargar siempre idiomas en modo de ahorro de datos + + Preferencias de traducción + + Traducción automática + + No traducir nunca estos sitios + + Descargar idiomas + + + + Traducción automática + + Selecciona un idioma para administrar las preferencias de ”traducir siempre“ y ”no traducir nunca“. + + + + Ofrecer traducción (predeterminado) + + %1$s ofrecerá traducir sitios en este idioma. + + Traducir siempre + + + %1$s traducirá automáticamente este idioma cuando se cargue la página. + + No traducir nunca + + %1$s nunca ofrecerá traducir sitios en este idioma. + + + + No traducir nunca estos sitios + + Para añadir un sitio nuevo: visítalo y selecciona “No traducir nunca este sitio” en el menú de traducción. + + Eliminar %1$s + + ¿Eliminar %1$s? + + Eliminar + + Cancelar + + + + Descargar idiomas + + Descarga idiomas completos para traducciones más rápidas y para traducir sin conexión. %1$s + + Saber más + + Idiomas disponibles + + requerido + + %1$s (%2$s) + + Descargar idiomas + + Todos los idiomas + + Eliminar + + En curso + + Descargar + + Seleccionado + + + ¿Eliminar %1$s (%2$s)? + + Si eliminas este idioma, %1$s descargará parcialmente idiomas a la caché durante la traducción. + + ¿Eliminar todos los idiomas (%1$s)? + + Si eliminas todos los idiomas, %1$s descargará parcialmente idiomas a la caché durante la traducción. + + Eliminar + + Cancelar + + + ¿Descargar en modo de ahorro de datos (%1$s)? + + Descargamos idiomas parcialmente a la caché para mantener las traducciones privadas. + + Descargar siempre en modo de ahorro de datos + + Descargar + + Descargar y traducir + + Cancelar + + + + Herramientas de depuración + + Ir a la página anterior + + Herramientas de pestañas + + Número de pestañas + + Activa + + Inactiva + + Privada + + Total + + Herramienta de creación de pestañas + + Cantidad de pestañas a crear + + Añadir a pestañas activas + + Añadir a pestañas inactivas + + Añadir a pestañas privadas diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index 3152735511cc..54a60e5f2011 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -63,6 +63,19 @@ %1$s limpia tu historial de búsqueda y navegación cuando cierras la aplicación o todas las pestañas privadas. Aunque no te hace anónimo para los sitios web o proveedores de servicios de Internet, te ayuda a mantener en privado lo que haces en línea frente a cualquier otra persona que use este dispositivo. Mitos comunes sobre la navegación privada + + + No dejar rastros en este dispositivo + + %1$s elimina tus cookies, historial y datos del sitio cuando cierras todas tus pestañas privadas. %2$s + + ¿Quién podría ver mi actividad? + Inicia tu próxima pestaña privada con un toque. @@ -85,6 +98,12 @@ Más información sobre la protección total de cookies + + + + Toca aquí para iniciar una nueva sesión privada. Elimina tu historial, cookies — todo. + + Se necesita acceso a la cámara. Ve a los ajustes de Android, presiona permisos y permitir. @@ -93,7 +112,7 @@ Descartar - Configura las pestañas abiertas para que se cierren automáticamente que no se hayan visto en el último día, semana o mes. + Configura el cierre automático de las pestañas que no se hayan visto en el último día, semana o mes. Ver opciones @@ -121,7 +140,10 @@ Nueva pestaña - Nueva pestaña privada + Pestaña privada + + + Contraseñas @@ -180,6 +202,8 @@ Sitio de escritorio + + Abrir en pestaña normal Agregar a pantalla de inicio @@ -221,6 +245,9 @@ Pantalla de inicio + + Eliminar historial de navegación Seleccionar idioma @@ -233,7 +260,7 @@ Escanear - Motor de búsqueda + Motor de búsqueda Configuración del buscador @@ -247,7 +274,7 @@ %s compartirá todo lo que escribas en la barra de direcciones con tu buscador predeterminado. - + Buscar %s Buscar directamente desde la barra de direcciones @@ -258,6 +285,9 @@ Esta vez buscar en: + + Buscador %s + Conoce tu página de inicio personalizada. Las pestañas recientes, marcadores y resultados de búsqueda aparecerán aquí. @@ -294,51 +324,30 @@ Ahora no - - - Haz de %s tu navegador favorito - - Haz de Firefox tu navegador favorito - - %1$s pone a las personas por encima de las ganancias y defiende tu privacidad al bloquear los rastreadores entre sitios.\n\nObtén más información en nuestro %2$s. - - Firefox coloca a las personas por encima de las ganancias y defiende tu privacidad bloqueando rastreadores entre sitios.\n\nObtén más información en nuestro aviso de privacidad. + + + Nos encanta mantenerte a salvo - política de privacidad + política de privacidad - Establecer como navegador predeterminado + Establecer como navegador predeterminado - Ahora no - - Cambia del teléfono a la computadora y viceversa - - Lleva tus pestañas y contraseñas de tus otros dispositivos a donde quieras. + Ahora no - Iniciar sesión + Iniciar sesión - Ahora no - - Las notificaciones te ayudan a hacer más con %s - - Las notificaciones te ayudan a hacer más con Firefox - - Envía pestañas entre dispositivos, administra descargas y obtén sugerencias para aprovechar al máximo %s. - - Envía pestañas entre dispositivos, administra descargas y obtén consejos para sacar el máximo provecho de Firefox. + Ahora no - Activar las notificaciones + Activar las notificaciones - Ahora no + Ahora no + + + Agregar widget de Firefox + + Ahora no @@ -359,12 +368,26 @@ General Acerca de + + Selecciona uno + + Editar motores visibles en el menú de búsqueda + + Motores visibles en el menú de búsqueda Motor de búsqueda predeterminado Buscar - - Barra de direcciones + + Motores de búsqueda + + Sugerencias de motores de búsqueda + + Preferencias de la barra de direcciones + + Barra de direcciones - Sugerencias de Firefox + + Saber más sobre Firefox Suggest Calificar en Google Play - Reducción de banner de cookies + Reducción de banner de cookies + + Bloqueador de anuncios de cookies + + Bloqueador de anuncios de cookies en navegación privada - Reducir banners de cookies + Reducir banners de cookies - Desactivado + Desactivado - Activado + Activado - %1$s intenta rechazar automáticamente las solicitudes de cookies en los banners de cookies. + %1$s intenta rechazar automáticamente las solicitudes de cookies en los banners de cookies. Desactivar para este sitio Cancelar - Solicitar soporte - - Reducción de avisos de cookies + Enviar solicitud ¿Solicitar soporte para este sitio? - La solicitud de soporte ha sido enviada. - Solicitud enviada Activar para este sitio - La solicitud de soporte ha sido enviada - Solicitud de soporte enviada Sitio actualmente no soportado - ¿Activar la reducción de banner de cookies para %1$s? + ¿Activar la reducción de banner de cookies para %1$s? + + ¿Activar el bloqueo de aviso de cookies para %1$s? - ¿Desactivar la reducción de banner de cookies para %1$s? + ¿Desactivar la reducción de banner de cookies para %1$s? - - Este sitio actualmente no es compatible con la reducción de avisos de cookies. ¿Quieres pedirle a nuestro equipo que revise este sitio web y agregue soporte en el futuro? + + ¿Desactivar el bloqueo de aviso de cookies para %1$s? %1$s no puede rechazar automáticamente las solicitudes de cookies en este sitio. Puedes enviar una solicitud para ayudar a este sitio en el futuro. - %1$s borrará las cookies de este sitio y actualizará la página. Borrar todas las cookies puede cerrar tu sesión o vaciar los carritos de compras. + %1$s borrará las cookies de este sitio y actualizará la página. Borrar todas las cookies puede cerrar tu sesión o vaciar los carritos de compras. - %1$s intenta rechazar automáticamente todas las solicitudes de cookies en los sitios admitidos. + %1$s intenta rechazar automáticamente todas las solicitudes de cookies en los sitios admitidos. - ¿Permitir que %1$s? rechace los banners de cookies? + ¿Permitir que %1$s? rechace los banners de cookies? - %1$s puede rechazar automáticamente muchas solicitudes de banner de cookies. + %1$s puede rechazar automáticamente muchas solicitudes de banner de cookies. - Ahora no + Ahora no - Verás menos solicitudes de cookies + Verás menos solicitudes de cookies - Permitir + Permitir Intentar conectarse automáticamente a sitios que utilizan el protocolo de encriptación HTTPS para mayor seguridad. @@ -472,12 +495,8 @@ Sin embargo, también es posible que un atacante esté involucrado. Si continúas en el sitio web, no debes ingresar ninguna información confidencial. Si continúas, el modo HTTPS se desactivará temporalmente para el sitio. Accesibilidad - - Servidor personalizado de cuenta de Firefox Servidor personalizado de Sync - - Servidores de cuenta de Firefox y Sync modificados. Cerrando la aplicación para aplicar los cambios… Cuenta @@ -492,8 +511,6 @@ Personalizar Inicia sesión para sincronizar pestañas, marcadores, contraseñas y más. - - Cuenta de Firefox Volver a conectarse para reanudar la sincronización @@ -505,8 +522,6 @@ Recopilación de datos Depuración remota vía USB - - Mostrar motores de búsqueda Mostrar sugerencias de búsqueda @@ -535,6 +550,10 @@ Nunca Administrador de descargas externo + + + Habilitar registros de Gecko + Complementos @@ -600,12 +619,6 @@ Clásico %s - - Edición limitada - - La nueva colección Voces Independientes. %s - - La nueva colección Voces Independientes. Prueba un toque de color @@ -613,13 +626,6 @@ Explorar más fondos de pantalla - - - Complemento no compatible - - El complemento ya está instalado - - Sincronizar ahora @@ -914,10 +920,10 @@ Abrir pestañas Nombre de la colección - - Renombrar - - Eliminar + + Renombrar + + Eliminar Eliminar del historial @@ -1187,7 +1193,7 @@ Compartir Guardar como PDF - + No se puede generar PDF Enviar a dispositivo @@ -1323,16 +1329,12 @@ Eliminar datos del navegador - Abrir pestañas + Pestañas abiertas %d pestañas - - Historial de navegación y datos de sitios %d direcciones - - Cookies Se cerrará sesión en la mayoría de los sitios @@ -1355,7 +1357,7 @@ Rango de tiempo a eliminar - Se elimina historial (incluyendo historial sincronizado de otros dispositivos), cookies y otros datos de navegación. + Se elimina historial (incluyendo historial sincronizado de otros dispositivos), cookies y otros datos de navegación. Última hora @@ -1385,64 +1387,10 @@ Grupo eliminado - - Te damos la bienvenida a un mejor internet - - Un navegador creado para las personas, no para las ganancias. - - Continúa donde lo dejaste - - Sincroniza pestañas y contraseñas entre dispositivos para cambiar de pantalla sin problemas. - - Iniciar sesión Sync está activado - - Protección a tu privacidad de forma predeterminada - - %1$s automáticamente detiene a las compañías que secretamente te siguen en la web. - - Cuenta con protección total de cookies para evitar que los rastreadores las usen para espiarte cuando navegues. - - Estándar (predeterminado) - - Equilibrado para privacidad y rendimiento. Las páginas se cargarán normalmente. - - - Estricto - - Bloquea más rastreadores para que las páginas se carguen más rápido, pero pueden fallar algunas funcionalidades de la página. - - Escoge la posición de la barra de herramientas - - - Manténlo en la parte inferior o muévelo a la parte superior. - - Tu controlas tus datos - - Firefox te da control sobre lo que compartes en línea y lo que compartes con nosotros. - - Leer nuestro aviso de privacidad - - - ¿Ya te preparaste para un internet increíble? - - Comenzar a navegar - - Elige tu tema - - Ahorra batería y vista con el modo oscuro. - - Automático - - Se adapta a la configuración de tu dispositivo - - Tema oscuro - - Tema claro - ¡Pestañas enviadas! @@ -1477,12 +1425,8 @@ Ajustes de protección Protección contra rastreo mejorada - - Navega sin que te sigan Ahora con protección total de cookies, nuestra barrera más poderosa hasta el momento contra los rastreadores entre sitios. - - Protege tus datos. %s te protege de muchos de los rastreadores más comunes que siguen lo que haces en línea. %s te protege de muchos de los rastreadores más comunes que rastrean lo que haces en línea. @@ -1490,16 +1434,12 @@ Estándar (predeterminado) - Equilibrado para privacidad y rendimiento. Las páginas se cargarán normalmente. - Las páginas se cargarán normalmente, pero se bloquearán menos rastreadores. Qué es lo que está bloqueado por la protección estándar contra el rastreo Estricto - Bloquea más rastreadores para que las páginas se carguen más rápido, pero pueden fallar algunas funcionalidades de la página. - Protección contra rastreo mejorada y mayor rendimiento, pero puede que algunos sitios no funcionen correctamente. Qué es lo que está bloqueado por la protección estricta contra el rastreo @@ -1705,7 +1645,7 @@ Ocultar contraseña - Desbloquear para ver tus inicios de sesión guardados + Desbloquea para ver tus credenciales guardadas Asegurar tus usuarios y contraseñas @@ -1793,7 +1733,7 @@ Por favor, llena este campo - Desbloquear para ver tus tarjetas guardadas + Desbloquea para ver tus tarjetas guardadas Asegurar tus tarjetas de crédito @@ -1858,21 +1798,11 @@ Agregar motor de búsqueda Editar motor de búsqueda - - Agregar - - Guardar Editar Eliminar - - Otro - - Nombre - - Cadena de búsqueda a usar Reemplazar la consulta con “%s”. Ejemplo:\n https://www.google.com/search?q=%s @@ -2006,14 +1936,14 @@ Accesos directos - - Nombre + + Nombre Nombre del atajo - - Aceptar - - Cancelar + + Aceptar + + Cancelar Ajustes @@ -2091,6 +2021,21 @@ Ir a la configuración + + Saber más + + política de privacidad + + Política de privacidad + + términos de uso + + Términos de uso + + Sí, probarlo + + Ahora no + contraer @@ -2102,4 +2047,7 @@ leer el artículo abrir enlace para saber más - + + + + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ad76654c896c..b4763ca59c53 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -71,11 +71,6 @@ No dejar rastro en este dispositivo - - %1$s elimina tus cookies, historial y datos del sitio cuando cierras todas tus ventanas privadas. %2$s - - Haz de Firefox tu navegador favorito Nos encanta mantenerte a salvo - - Firefox antepone las personas al lucro y defiende tu privacidad al bloquear los rastreadores entre sitios.\n\nObtén más información en nuestro aviso de privacidad. Nuestro navegador respaldado por una organización sin ánimo de lucro ayuda a evitar que las empresas te sigan en secreto en la web.\n\nMás información en nuestro aviso de privacidad. Ahora no - Salta del teléfono al ordenador y viceversa - Mantén todo cifrado cuando pases de un dispositivo a otro - - Recupera las pestañas y contraseñas de tus otros dispositivos para continuar desde donde lo habías dejado. Tras iniciar sesión y sincronizar, estás más seguro. Firefox cifra tus contraseñas, marcadores y más. @@ -365,15 +350,9 @@ Iniciar sesión Ahora no - - Las notificaciones te ayudan a hacer más con Firefox Las notificaciones te ayudan a estar más seguro con Firefox - - Envía pestañas entre dispositivos, administra descargas y obtén consejos para obtener el máximo de Firefox. Envía pestañas de forma segura entre tus dispositivos y descubre otras funciones de privacidad en Firefox. @@ -417,8 +396,6 @@ Selecciona uno - Administrar atajos de búsqueda - Administrar buscadores alternativos Editar buscadores visibles en el menú de búsqueda @@ -432,8 +409,6 @@ Buscadores Sugerencias de buscadores - - Barra de direcciones Preferencias de la barra de direcciones @@ -555,14 +530,10 @@ Sin embargo, también es posible que se trate de un atacante. Si continúas en el sitio web, no debes introducir ninguna información sensible. Si continúas, el modo Solo HTTPS se desactivará temporalmente para el sitio. Accesibilidad - - Servidor personalizado de cuenta de Firefox Servidor personalizado de cuenta de Mozilla Servidor personalizado de Sync - - Servidores de cuenta de Firefox y Sync modificados. Cerrando la aplicación para aplicar los cambios… Servidores de cuenta de Mozilla y Sync modificados. Cerrando la aplicación para aplicar los cambios… @@ -580,8 +551,6 @@ Inicia sesión para sincronizar pestañas, marcadores, contraseñas y más. - Cuenta Firefox - Cuenta de Mozilla Reconectar para reanudar la sincronización @@ -593,8 +562,6 @@ Recopilación de datos Depuración remota vía USB - - Mostrar buscadores Mostrar sugerencias de búsqueda @@ -726,12 +693,6 @@ Explorar complementos - - - El complemento no es compatible - - El complemento ya está instalado - Los complementos están desactivados temporalmente @@ -1629,6 +1590,8 @@ Todas las cookies (algunos sitios no funcionarán correctamente) Aislar cookies entre sitios + + Decir a los sitios web que no vendan ni compartan mis datos Contenido de rastreo @@ -1971,29 +1934,19 @@ Añadir nuevo buscador Editar buscador - - Añadir - - Guardar Editar Eliminar - - Otro Nombre - - Nombre Nombre del buscador URL de cadena de búsqueda - Cadena de búsqueda a usar - URL a utilizar para la búsqueda Reemplazar la consulta con “%s”. Ejemplo:\n https://www.google.com/search?q=%s @@ -2223,8 +2176,6 @@ - Verificador de reseñas - Verificador de reseñas Reseñas fiables @@ -2237,7 +2188,9 @@ Calificación ajustada - Se han eliminado las reseñas no fiables + Se han eliminado las reseñas no fiables + + Basado en revisiones fiables Aspectos destacados de reseñas recientes @@ -2248,14 +2201,10 @@ calificación con letras de la A a la F.]]> Revisiones fiables. Creemos que las reseñas probablemente provienen de clientes reales que dejaron reseñas honestas e imparciales. - - Creemos que las reseñas son fiables. Creemos que hay una combinación de reseñas fiables y no fiables. Reseñas poco fiables. Creemos que las reseñas probablemente son falsas o provienen de revisores sesgados. - - Creemos que las reseñas no son fiables. calificación ajustada se basa únicamente en reseñas que consideramos fiables.]]> @@ -2271,8 +2220,6 @@ Mostrar anuncios en el verificador de reseñas - Verás anuncios ocasionales de productos relevantes. Todos los anuncios deben cumplir con nuestros estándares de calidad de revisión. %s - Verá anuncios ocasionales de productos relevantes. Solo anunciamos productos con revisiones fiables. %s Saber más @@ -2295,23 +2242,23 @@ Cuando este producto tenga más reseñas, podremos analizar su calidad. - El producto no está disponible + El producto no está disponible - Si ves que este producto vuelve a estar disponible, infórmanos y trabajaremos para actualizar el análisis. - - Informar que este producto vuelve a estar disponible + Si ves que este producto vuelve a estar disponible, infórmanos y trabajaremos para actualizar el análisis. - Informar que el producto está en stock + Informar que el producto está en stock - Comprobando la calidad de la reseña + Comprobando la calidad de la reseña - Comprobando la calidad de la reseña + Comprobando la calidad de la reseña + + Comprobando la calidad de la reseña (%s) Esto podría tardar unos 60 segundos. - ¡Gracias por informar! + ¡Gracias por informar! - Deberíamos tener información sobre las reseñas de este producto en 24 horas. Por favor, vuelve a comprobarlo más tarde. + Deberíamos tener información sobre las reseñas de este producto en 24 horas. Por favor, vuelve a comprobarlo más tarde. No podemos comprobar estas reseñas @@ -2395,6 +2342,9 @@ Competitividad + + “%s” + contraer @@ -2412,4 +2362,172 @@ abrir enlace para saber más %s, Cabecera + + + + + + ¿Traducir esta página? + + Probar traducciones privadas en %1$s + + Para tu privacidad, las traducciones nunca salen de tu dispositivo. ¡Nuevos idiomas y mejoras próximamente! %1$s + + Saber más + + Traducir del + + Traducir a + + Ahora no + + Traducir + + Traduciendo + + Traducción en curso + + + + Opciones de traducción + + Siempre ofrecer la traducción + + Siempre traducir %1$s + + No traducir nunca %1$s + + No traducir nunca este sitio + + Ajustes de traducción + + Acerca de las traducciones en %1$s + + + + Traducciones + + Ofrecer la traducción cuando sea posible + + Descargar siempre idiomas en modo de ahorro de datos + + Preferencias de traducción + + Traducción automática + + No traducir nunca estos sitios + + Descargar idiomas + + + + Traducción automática + + Selecciona un idioma para administrar las preferencias de ”traducir siempre“ y ”no traducir nunca“. + + + + Ofrecer traducción (predeterminado) + + %1$s ofrecerá traducir sitios en este idioma. + + Traducir siempre + + + %1$s traducirá automáticamente este idioma cuando se cargue la página. + + No traducir nunca + + %1$s nunca ofrecerá traducir sitios en este idioma. + + + + No traducir nunca estos sitios + + Para añadir un sitio nuevo: visítalo y selecciona “No traducir nunca este sitio” en el menú de traducción. + + Eliminar %1$s + + ¿Eliminar %1$s? + + Eliminar + + Cancelar + + + + Descargar idiomas + + Descarga idiomas completos para traducciones más rápidas y para traducir sin conexión. %1$s + + Saber más + + Idiomas disponibles + + requerido + + %1$s (%2$s) + + Descargar idiomas + + Todos los idiomas + + Eliminar + + En curso + + Descargar + + Seleccionado + + + ¿Eliminar %1$s (%2$s)? + + Si eliminas este idioma, %1$s descargará parcialmente idiomas a la caché durante la traducción. + + ¿Eliminar todos los idiomas (%1$s)? + + Si eliminas todos los idiomas, %1$s descargará parcialmente idiomas a la caché durante la traducción. + + Eliminar + + Cancelar + + + ¿Descargar en modo de ahorro de datos (%1$s)? + + Descargamos idiomas parcialmente a la caché para mantener las traducciones privadas. + + Descargar siempre en modo de ahorro de datos + + Descargar + + Descargar y traducir + + Cancelar + + + + Herramientas de pestañas + + Número de pestañas + + Activa + + Inactiva + + Privada + + Total diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 9f43c9012a91..fe73b76fcece 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -70,11 +70,6 @@ Ez utzi arrastorik gailu honetan - - %1$s(e)k zure cookieak, historia eta guneetako datuak ezabatzen ditu leiho pribatu guztiak ixten dituzunean. %2$s - - Egizu Firefox zure lehenengo nabigatzailea Zu seguru mantentzea dugu xede - - Firefoxek jendea jartzen du irabazi-asmoen aurretik eta zure pribatutasuna defendatzen du guneen arteko jarraipen-elementuak blokeatuz.\n\nArgibide gehiago gure pribatutasun-oharrean. Irabazi asmorik gabeko erakundeak babestutako gure nabigatzaileak laguntzen du eragozten enpresek zure webeko jarraipena sekretupean egin dezaten.\n\n @@ -353,11 +342,7 @@ Argibide gehiago gure pribatutasun-oharrean. Une honetan ez - Egin salto telefonotik ordenagailu eramangarrira eta atzera - Mantendu zifratzea gailuen artean salto egitean - - Erabili zure beste gailuetako fitxak eta pasahitzak, utzitako lekutik jarraitu ahal izateko. Saioa hasita eta sinkronizatuta zaudenean, seguruago zaude. Firefoxek @@ -366,15 +351,9 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Hasi saioa Une honetan ez - - Jakinarazpenek Firefoxi zuku gehiago ateratzen laguntzen dizute Jakinarazpenek Firefoxekin seguruago egoten laguntzen dizute - - Bidali fitxak gailuen artean, kudeatu deskargak eta eskuratu Firefoxi zuku gehien ateratzeko aholkuak. Bidali fitxak gailuen artean modu seguruan eta aurkitu Firefoxen bestelako pribatutasun eginbideak. @@ -417,8 +396,6 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Hautatu bat - Kudeatu bilaketarako lasterbideak - Kudeatu ordezko bilaketa-motorrak Editatu bilaketa menuan ikusgai dauden motorrak @@ -432,8 +409,6 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Bilaketa-motorrak Bilaketa-motorretako gomendioak - - Helbide-barra Helbide-barrako hobespenak @@ -556,14 +531,10 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Halere, baliteke erasotzaile bat tartean izatea. Webgunera jarraituz gero, ez zenuke kontuzko informaziorik sartu behar. Jarraitzen baduzu, HTTPS-Only modua behin-behinean desgaitu egingo da gunerako. Erabilgarritasuna - - Firefox Account zerbitzari pertsonalizatua Mozilla kontu-zerbitzari pertsonalizatua Sinkronizaziorako zerbitzari pertsonalizatua - - Firefox Account/Sync zerbitzaria aldatuta. Aplikaziotik irteten aldaketak aplikatzeko… Mozilla kontuko/Sync zerbitzaria aldatuta. Aplikaziotik irteten aldaketak aplikatzeko… @@ -581,8 +552,6 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Hasi saioa fitxak, laster-markak, pasahitzak eta gehiago sinkronizatzeko. - Firefox kontua - Mozilla kontua Birkonektatu sinkronizatzeari berrekiteko @@ -594,8 +563,6 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Datu-bilketa USB bidezko urruneko arazketa - - Erakutsi bilaketa-motorrak Erakutsi bilaketa-iradokizunak @@ -727,12 +694,6 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Esploratu gehigarriak - - - Gehigarria ez da onartzen - - Gehigarria instalatuta dago jada - Gehigarriak aldi baterako desgaitu dira @@ -1611,6 +1572,8 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Cookie guztiak (webguneak apurtuko ditu) Isolatu guneen arteko cookieak + + Esan webguneei nire datuak ez partekatzeko edo saltzeko Edukiaren jarraipena @@ -1948,28 +1911,18 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Gehitu bilaketa-motor berria Editatu bilaketa-motorra - - Gehitu - - Gorde Editatu Ezabatu - - Bestelakoa Izena - - Izena Bilaketa-motorraren izena Bilaketa-katearen URLa - Erabili beharreko bilaketa-katea - Bilatzeko erabili beharreko URLa Ordezkatu galdera-katea "%s" testuarekin. Adibidez:\nhttps://www.google.com/search?q=%s @@ -2199,8 +2152,6 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. - Balorazioen egiaztatzailea - Balorazioen egiaztatzailea Balorazio fidagarriak @@ -2213,7 +2164,9 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Egokitutako balorazioa - Balorazio fidagaitzak kenduta + Balorazio fidagaitzak kenduta + + Balorazio fidagarrietan oinarrituta Azken balorazioetan nabarmentzekoak @@ -2224,15 +2177,11 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. letra maila bat esleitzen diegu.]]> Balorazio fidagarriak. Uste dugu balorazioak benetako bezeroenak direla eta zintzo eta aurreiritzirik gabe utzi dituztela. - - Balorazioak fidatzekoak direla uste dugu. Uste dugu balorazio fidagarri eta fidagaitzen arteko nahasketa bat dagoela. Balorazio fidagaitzak. Uste dugu balorazioak ziurrenik faltsuak direla edo kritika aurreiritzidunak dituztela. - - Balorazioak ez direla fidatzekoak uste dugu. Egokitutako balorazioa fidagarriak direla uste ditugun balorazioetan dago oinarrituta soilik.]]> @@ -2248,8 +2197,6 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Erakutsi iragarkiak balorazioen egiaztatzailean - Tarteka iragarkiak ikusiko dituzu produktu aproposentzat. Iragarki guztiek gure berrikuspenen kalitate-estandarrak bete behar dituzte. %s - Tarteka iragarkiak ikusiko dituzu produktu aproposentzat. Fidatzeko balorazioak dituzten produktuak iragartzen ditugu soilik. %s Argibide gehiago @@ -2272,23 +2219,23 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Produktu honek balorazio gehiago dituenean, hauen kalitatea egiaztatu ahal izango dugu. - Produktua ez dago erabilgarri + Produktua ez dago erabilgarri - Produktua berriz ere erabilgarri dagoela ikusten baduzu, jakinaraz iezaguzu eta balorazioak egiaztatzeari ekingo diogu. - - Jakinarazi produktu hau berriz ere erabilgarri dagoela + Produktua berriz ere erabilgarri dagoela ikusten baduzu, jakinaraz iezaguzu eta balorazioak egiaztatzeari ekingo diogu. - Jakinarazi produktua berriz ere erabilgarri dagoela + Jakinarazi produktua berriz ere erabilgarri dagoela - Balorazioaren kalitatea egiaztatzen + Balorazioaren kalitatea egiaztatzen - Balorazioaren kalitatea egiaztatzen + Balorazioaren kalitatea egiaztatzen + + Balorazioaren kalitatea egiaztatzen (%s) 60 bat segundo har litzake honek. - Eskerrik asko jakinarazpenagatik! + Eskerrik asko jakinarazpenagatik! - Produktu honen balorazioei buruzko informazioa 24 ordu barru izan behar genuke. Itzuli geroago mesedez. + Produktu honen balorazioei buruzko informazioa 24 ordu barru izan behar genuke. Itzuli geroago mesedez. Ezin ditugu balorazio hauek egiaztatu @@ -2373,6 +2320,9 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. Lehiakortasuna + + "%s" + tolestu @@ -2390,4 +2340,172 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du. ireki lotura argibide gehiagorako %s, Goiburua + + + + + + Itzuli orria? + + Probatu itzulpen pribatuak %1$s(e)n + + Zure pribatutasunerako, itzulpenek inoiz ez dute zure gailua uzten. Hizkuntza berriak eta hobekuntzak laster datoz! %1$s + + Argibide gehiago + + Itzuli hemendik + + Itzuli hona + + Une honetan ez + + Itzuli + + Itzultzen + + Itzulpena burutzen + + + + Itzulpenen aukerak + + Eskaini beti itzultzea + + Itzuli beti %1$s + + + Inoiz ez itzuli %1$s + + Inoiz ez itzuli gune hau + + Itzulpenen ezarpenak + + %1$s(e)ko itzulpenei buruz + + + + Itzulpenak + + Ahal denean, eskaini itzultzea + + Deskargatu beti hizkuntzak datuak aurrezteko moduan + + Itzulpenaren hobespenak + + Itzulpen automatikoa + + Inoiz ez itzuli gune hauek + + Deskargatu hizkuntzak + + + + Itzulpen automatikoa + + Hautatu hizkuntza bat bere "itzuli beti" eta "inoiz ez itzuli" hobespenak kudeatzeko. + + + + Eskaini itzultzea (lehenetsia) + + Hizkuntza honetako guneak itzultzea eskainiko du %1$s(e)k. + + Itzuli beti + + Orria kargatzean, hizkuntza hau automatikoki itzuliko du %1$s(e)k. + + Inoiz ez itzuli + + %1$s(e)k inoiz ez du eskainiko hizkuntza honetan dauden guneak itzultzea. + + + + Inoiz ez itzuli gune hauek + + Gune berri bat gehitzeko: bisita ezazu eta itzulpen-menutik hautatu "Inoiz ez itzuli gune hau". + + Kendu %1$s + + %1$s ezabatu? + + Ezabatu + + Utzi + + + + Deskargatu hizkuntzak + + Deskargatu hizkuntza osoak itzulpen azkarragoetarako eta lineaz kanpo ere itzuli ahal izateko. %1$s + + Argibide gehiago + + Hizkuntza erabilgarriak + + beharrezkoa + + %1$s (%2$s) + + Deskargatu hizkuntzak + + Hizkuntza guztiak + + Ezabatu + + Lanean + + Deskargatu + + Hautatuta + + + Ezabatu %1$s (%2$s)? + + Hizkuntza hau ezabatuz gero, itzuli ahala deskargatuko ditu %1$s(e)k hizkuntzak zure cachera. + + Ezabatu hizkuntza guztiak (%1$s)? + + Hizkuntza guztiak ezabatuz gero, itzuli ahala deskargatuko ditu %1$s(e)k hizkuntzak zure cachera. + + Ezabatu + + Utzi + + + Deskargatu datuak aurrezteko moduan egotean (%1$s)? + + Hizkuntzak erdizka deskargatzen ditugu zure cachera itzulpenak pribatu manten daitezen. + + Deskargatu beti datuak aurrezteko moduan + + Deskargatu + + Deskargatu eta itzuli + + Utzi + + + + Fitxen tresnak + + Fitxa kopurua + + Aktibo + + Inaktibo + + Pribatua + + Guztira diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 521476598b55..33519fbb0131 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -70,11 +70,6 @@ Älä jätä jälkiä tähän laitteeseen - - %1$s poistaa evästeet, historian ja sivustotiedot, kun suljet kaikki yksityiset ikkunasi. %2$s Etsi sivulta + + Käännä sivu Tallenna kokoelmaan @@ -335,14 +332,8 @@ Ei nyt - - Aseta Firefox selaimeksesi Turvaamisesi on tärkeää meille - - Firefox asettaa ihmiset voittojen edelle ja suojaa yksityisyyttäsi estämällä sivustojen väliset seuraimet.\n\nLisätietoja on tietosuojaselosteessamme. Voittoa tavoittelemattoman tahon tukema selaimemme auttaa estämään yrityksiä seuraamasta sinua salaa verkossa.\n\nLisätietoja on tietosuojakäytännössämme. Ei nyt - Hyppää puhelimelta kannettavalle tietokoneelle ja takaisin - Pysy salattuna, kun vaihtelet laitteiden välillä - - Nappaa välilehdet ja salasanat muilta laitteiltasi ja jatka siitä, mihin jäit. Kun olet kirjautunut sisään ja synkronoitu, tietosi ovat paremmassa turvassa. Firefox salaa salasanasi, kirjanmerkkisi ja paljon muuta. @@ -365,15 +352,9 @@ Kirjaudu sisään Ei nyt - - Ilmoitukset auttavat sinua tekemään enemmän Firefoxilla Ilmoitukset auttavat sinua pysymään paremmassa turvassa Firefoxilla - - Lähetä välilehtiä laitteiden välillä, hallitse latauksia ja saa vinkkejä, joiden avulla saat kaiken irti Firefoxista. Lähetä turvallisesti välilehtiä laitteidesi välillä ja löydä muita Firefoxin tietosuojaominaisuuksia. @@ -415,8 +396,6 @@ Valitse yksi - Hallinnoi hakuoikopolkuja - Hallitse vaihtoehtoisia hakukoneita Muokkaa hakuvalikossa näkyviä koneita @@ -430,8 +409,6 @@ Hakukoneet Ehdotukset hakukoneilta - - Osoitepalkki Osoitepalkin asetukset @@ -555,14 +532,10 @@ On kuitenkin myös mahdollista, että hyökkäävä taho on läsnä. Jos jatkat verkkosivustolle, älä anna arkaluonteisia tietoja. Jos jatkat, "Vain HTTPS"-tila poistetaan väliaikaisesti käytöstä sivustolta. Saavutettavuus - - Mukautettu Firefox-tilin palvelin Mukautettu Mozilla-tilin palvelin Mukautettu synkronointipalvelin - - Firefox-tilin tai synkronoinnin palvelinta muutettu. Lopetetaan sovellus, jotta muutokset tulevat voimaan… Mozilla-tilin tai synkronoinnin palvelinta muutettu. Lopetetaan sovellus, jotta muutokset tulevat voimaan… @@ -580,8 +553,6 @@ Kirjaudu sisään synkronoidaksesi välilehtesi, kirjanmerkkisi, salasanasi ja muita tietoja. - Firefox-tili - Mozilla-tili Yhdistä uudelleen jatkaaksesi synkronointia @@ -593,8 +564,6 @@ Tietojen keruu Etävianjäljitys USB:n kautta - - Näytä hakukoneet Näytä hakuehdotukset @@ -727,12 +696,6 @@ Tutustu lisäosiin - - - Lisäosa ei ole tuettu - - Lisäosa on jo asennettu - Lisäosat on väliaikaisesti poistettu käytöstä @@ -1374,6 +1337,11 @@ Sulje yksityiset välilehdet + + + Suljetaanko yksityiset välilehdet? + Sulje yksityiset välilehdet napauttamalla tai pyyhkäisemällä tätä ilmoitusta. + Markkintointi @@ -1616,6 +1584,8 @@ Kaikki evästeet (aiheuttaa sivustovirheitä) Eristä sivustorajat ylittävät evästeet + + Pyydä verkkosivustoja olemaan jakamatta ja myymättä tietojani Seurantaan tarkoitettu sisältö @@ -1956,28 +1926,18 @@ Lisää uusi hakukone Muokkaa hakukonetta - - Lisää - - Tallenna Muokkaa Poista - - Muu Nimi - - Nimi Hakukoneen nimi Hakumerkkijonon URL-osoite - Käytettävä hakujono - URL-osoite, jota käytetään haussa Korvaa kysely käyttäen ”%s”. Esimerkki:\nhttps://www.google.com/search?q=%s @@ -2208,8 +2168,6 @@ - Arvostelun tarkistin - Arvostelun tarkistin Luotettavat arvostelut @@ -2222,7 +2180,9 @@ Oikaistu arvosana - Epäluotettavat arvostelut poistettu + Epäluotettavat arvostelut poistettu + + Luotettavien arvostelujen pohjalta Kohokohdat viimeaikaisista arvosteluista @@ -2233,14 +2193,10 @@ kirjainarvosanan A:sta F:ään.]]> Luotettavat arvostelut. Uskomme, että arvostelut ovat todennäköisesti todellisilta asiakkailta, jotka ovat jättäneet rehellisiä, puolueettomia arvosteluja. - - Uskomme, että arvostelut ovat luotettavia. Uskomme, että kyseessä on sekä luotettavia että epäluotettavia arvosteluja. Epäluotettavat arvostelut. Uskomme, että arvostelut ovat todennäköisesti vääriä tai puolueellisia. - - Uskomme, etteivät arvostelut ole luotettavia. Oikaistu arvosana perustuu vain niihin arvosteluihin, jotka koemme luotettaviksi.]]> @@ -2250,8 +2206,6 @@ Näytä mainoksia arvostelujen tarkistimessa - Näet ajoittain asiaan liittyvien tuotteiden mainoksia. Kaikkien mainosten on täytettävä arvosteluille asettamamme laatustandardit. %s - Näet ajoittain asiaan liittyvien tuotteiden mainoksia. Mainostamme vain luotettavia arvosteluja saaneita tuotteita. %s Lue lisää @@ -2274,23 +2228,23 @@ Kun tästä tuotteesta on enemmän arvosteluja, voimme tarkistaa niiden laadun. - Tuote ei ole saatavilla + Tuote ei ole saatavilla - Jos huomaat, että tämä tuote on jälleen varastossa, ilmoita siitä, niin tarkistamme arvostelut. + Jos huomaat, että tämä tuote on jälleen varastossa, ilmoita siitä, niin tarkistamme arvostelut. - Ilmoita, että tämä tuote on jälleen varastossa - - Ilmoita, että tuoteta on varastossa + Ilmoita, että tuoteta on varastossa - Tarkistetaan arvostelun laatua + Tarkistetaan arvostelun laatua - Tarkistetaan arvostelun laatua + Tarkistetaan arvostelun laatua + + Tarkistetaan arvostelun laatua (%s) Tämä voi kestää noin 60 sekuntia. - Kiitos ilmoituksesta! + Kiitos ilmoituksesta! - Meillä pitäisi olla tietoa tämän tuotteen arvosteluista 24 tunnin sisällä. Tarkista tilanne uudelleen. + Meillä pitäisi olla tietoa tämän tuotteen arvosteluista 24 tunnin sisällä. Tarkista tilanne uudelleen. Emme voi tarkistaa näitä arvosteluja @@ -2352,6 +2306,9 @@ Kilpailukyky + + “%s” + supista @@ -2367,4 +2324,211 @@ lukeaksesi artikkelin avataksesi linkin ja lukeaksesi lisää - + + + %s, Otsikko + + Linkit + + Linkkejä saatavilla + + + + + + Käännetäänkö sivu? + + + Kokeile yksityisiä käännöksiä %1$sissa + + Yksityisyytesi vuoksi käännökset eivät koskaan lähde laitteestasi eteenpäin. Uusia kieliä ja parannuksia tulossa pian! %1$s + + Lue lisää + + Käännä kieleltä + + Käännä kielelle + + Ei nyt + + Valmis + + Käännä + + Yritä uudestaan + + Käännetään + + Käännös käynnissä + + + Käännettäessä ilmeni ongelma. Yritä uudelleen. + + + Kieliä ei voitu ladata. Tarkista internetyhteytesi ja yritä uudelleen. + + Valitettavasti kieltä %1$s ei tueta vielä. + + Lue lisää + + + + Käännösasetukset + + Tarjoa aina käännöstä + + Käännä aina %1$s + + Älä koskaan käännä %1$s + + Älä koskaan käännä sivustoa + + Käännösasetukset + + + Tietoja käännöksistä %1$sissa + + + + Käännökset + + Tarjoa käännös, kun mahdollista + + Lataa aina kielet datansäästötilassa + + Kääntämisen asetukset + + Automaattinen käännös + + Älä käännä koskaan näitä sivustoja + + + Lataa kieliä + + + + Automaattinen käännös + + + Valitse kieli hallitaksesi "käännä aina"- ja "älä käännä koskaan"-asetuksia. + + + + Tarjoa käännöstä (oletus) + + %1$s tarjoaa tällä kielellä olevien sivustojen kääntämistä. + + Käännä aina + + %1$s kääntää tämän kielen automaattisesti, kun sivu latautuu. + + Älä käännä koskaan + + + %1$s ei koskaan tarjoa tällä kielellä olevien sivustojen kääntämistä. + + + + Älä käännä koskaan näitä sivustoja + + Uuden sivuston lisääminen: Käy sivustolla ja valitse käännösvalikosta “Älä käännä koskaan tätä sivustoa”. + + Poista %1$s + + Poistetaanko %1$s? + + Poista + + Peruuta + + + + Lataa kieliä + + Lataa kokonaisia kieliä nopeuttaaksesi käännöksiä ja kääntääksesi yhteydettömässä tilassa. %1$s + + Lue lisää + + Saatavilla olevat kielet + + vaadittu + + %1$s (%2$s) + + Lataa kielet + + Kaikki kielet + + Poista + + Käynnissä + + Lataa + + Valittu + + + Poistetaanko %1$s (%2$s)? + + Jos poistat tämän kielen, %1$s lataa osittaisia kieliä välimuistiin kääntäessäsi. + + Poistetaanko kaikki kielet (%1$s)? + + Jos poistat kaikki kielet, %1$s lataa osittaisia kieliä välimuistiin kääntäessäsi. + + Poista + + Peruuta + + + Ladataanko datansäästötilassa (%1$s)? + + Lataamme osittaiset kielet välimuistiin pitääksemme käännökset yksityisinä. + + Lataa aina datansäästötilassa + + Lataa + + Lataa ja käännä + + Peruuta + + + + Vianjäljitystyökalut + + Siirry taaksepäin + + Välilehtityökalut + + Välilehtien määrä + + Aktiivinen + + Passiivinen + + Yksityinen + + Yhteensä + + Välilehtien luontityökalu + + Luotavien välilehtien määrä + + Lisää aktiivisiin välilehtiin + + Lisää passiivisiin välilehtiin + + Lisää yksityisiin välilehtiin + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 818450a5d5a6..2b7597602244 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -70,11 +70,6 @@ Ne laissez aucune trace sur cet appareil - - %1$s efface cookies, historique de navigation et données de sites lorsque vous fermez toutes les fenêtres de navigation privée. %2$s Rechercher dans la page + + Traduire la page Enregistrer dans une collection @@ -335,14 +332,8 @@ Plus tard - - Faites de Firefox votre navigateur par défaut Votre protection compte pour nous - - Firefox fait passer les gens avant l’argent et défend votre vie privée en bloquant les traqueurs intersites.\n\nApprenez-en davantage dans notre politique de confidentialité. Notre navigateur soutenu par une organisation à but non lucratif empêche les entreprises de vous suivre secrètement sur le Web.\n\nPour en savoir plus, consultez notre politique de confidentialité. Plus tard - Passez du téléphone à l’ordinateur portable et vice-versa - Protégez-vous grâce au chiffrement lorsque vous passez d’un appareil à un autre - - Récupérez les onglets et mots de passe depuis vos autres appareils pour reprendre là où vous en étiez. Lorsque vous vous connectez et activez la synchronisation, votre sécurité est renforcée. Firefox chiffre vos mots de passe, vos marque-pages et bien d’autres choses. @@ -365,15 +352,9 @@ Connexion Plus tard - - Les notifications vous aident à en faire plus avec Firefox Les notifications vous aident à rester en sécurité avec Firefox - - Partagez des onglets entre vos appareils, gérez les téléchargements et obtenez des conseils pour tirer le meilleur parti de Firefox. Envoyez des onglets d’un appareil à un autre en toute sécurité et découvrez d’autres fonctionnalités de protection de la vie privée de Firefox. @@ -417,8 +398,6 @@ Sélectionnez une des options - Gérer les raccourcis de recherche - Gérer les autres moteurs de recherche Modifier les moteurs visibles dans le menu de recherche @@ -432,8 +411,6 @@ Moteurs de recherche Suggestions des moteurs de recherche - - Barre d’adresse Préférences pour la barre d’adresse @@ -555,14 +532,10 @@ Il est cependant aussi possible qu’il s’agisse d’une attaque. Si vous poursuiviez vers ce site web, vous ne devriez saisir aucune donnée sensible. Si vous continuez, le mode HTTPS uniquement sera désactivé temporairement pour ce site. Accessibilité - - Serveur de compte Firefox personnalisé Serveur de compte Mozilla personnalisé Serveur de synchronisation personnalisé - - Serveur de synchronisation/de compte Firefox modifié. Fermeture de l’application pour appliquer les modifications… Serveur pour la synchronisation ou le compte Mozilla modifié. Fermeture de l’application pour appliquer les modifications… @@ -580,8 +553,6 @@ Connectez-vous pour synchroniser onglets, marque-pages, mots de passe et bien plus. - Compte Firefox - Compte Mozilla Reconnectez-vous pour reprendre la synchronisation @@ -593,8 +564,6 @@ Collecte de données Débogage distant par USB - - Afficher les moteurs de recherche Afficher les suggestions de recherche @@ -726,12 +695,6 @@ Parcourir les modules complémentaires - - - Ce module complémentaire n’est pas pris en charge - - Ce module complémentaire est déjà installé - Modules complémentaires temporairement désactivés @@ -1388,6 +1351,10 @@ Fermer les onglets privés + + + Fermer les onglets privés ? + Marketing @@ -1630,6 +1597,8 @@ Tous les cookies (empêchera des sites de fonctionner) Isoler les cookies intersites + + Demander aux sites web de ne pas vendre ni partager mes données Contenu utilisé pour le pistage @@ -1967,28 +1936,18 @@ Ajouter un nouveau moteur de recherche Modifier le moteur de recherche - - Ajouter - - Enregistrer Modifier Supprimer - - Autre Nom - - Nom Nom du moteur de recherche URL de la chaîne de recherche - Chaîne de recherche à utiliser - URL à utiliser pour les recherches Remplacer les termes de la recherche par « %s ». Par exemple :\nhttps://www.google.com/search?q=%s @@ -2218,8 +2177,6 @@ - Vérificateur d’avis - Vérificateur d’avis Avis fiables @@ -2232,7 +2189,9 @@ Évaluation corrigée - Avis non fiables supprimés + Avis non fiables supprimés + + Sur la base d’avis fiables Points essentiels des avis récents @@ -2243,14 +2202,10 @@ notation alphabétique aux avis sur chaque produit, allant de A à F.]]> Avis fiables. Nous pensons que les avis proviennent probablement de véritables client·e·s qui ont laissé des avis sincères et objectifs. - - Nous pensons que ces avis sont fiables. Nous pensons que les avis regroupent des avis fiables et non fiables. Avis non fiables. Nous pensons que les avis sont probablement contrefaits ou proviennent d’utilisateurs partiaux. - - Nous pensons que ces avis ne sont pas fiables. évaluation corrigée se fonde uniquement sur les avis que nous considérons fiables.]]> @@ -2266,8 +2221,6 @@ Afficher des publicités dans le vérificateur d’avis - Vous verrez à l’occasion des publicités pour des produits pertinents. Ces produits doivent disposer d’avis qui répondent à nos critères de qualité. %s - Vous verrez à l’occasion des publicités pour des produits pertinents. Nous faisons uniquement la promotion de produits dont les avis sont fiables. %s En savoir plus @@ -2290,24 +2243,24 @@ Quand ce produit aura reçu suffisamment d’avis, leur qualité pourra être évaluée. - Le produit n’est pas disponible + Le produit n’est pas disponible - Si vous constatez le retour de ce produit en stock, signalez-le et nous travaillerons à évaluer les avis. + Si vous constatez le retour de ce produit en stock, signalez-le et nous travaillerons à évaluer les avis. - Signaler que ce produit est de retour en stock - - Signaler que le produit est en stock + Signaler que le produit est en stock - Évaluation de la qualité des avis + Évaluation de la qualité des avis - Évaluation de la qualité des avis + Évaluation de la qualité des avis + + Évaluation de la qualité des avis (%s) L’opération peut prendre environ 60 secondes. - Merci de nous l’avoir signalé ! + Merci de nous l’avoir signalé ! - Nous devrions avoir des informations au sujet des avis sur ce produit d’ici 24 heures. Revenez plus tard. + Nous devrions avoir des informations au sujet des avis sur ce produit d’ici 24 heures. Revenez plus tard. Nous ne pouvons pas vérifier ces avis @@ -2345,17 +2298,17 @@ En savoir plus - En sélectionnant « Oui, l’essayer », vous acceptez la %2$s et les %3$s de %1$s par Mozilla. + En sélectionnant « Oui, l’essayer », vous acceptez la %2$s et les %3$s de %1$s par Mozilla. - En sélectionnant « Oui, l’essayer » vous acceptez les éléments suivants de %1$s : + En sélectionnant « Oui, l’essayer » vous acceptez les éléments suivants de %1$s : - politique de confidentialité + politique de confidentialité - Politique de confidentialité + Politique de confidentialité - conditions d’utilisation + conditions d’utilisation - Conditions d’utilisation + Conditions d’utilisation Oui, l’essayer @@ -2392,6 +2345,9 @@ Compétitivité + + « %s » + réduire @@ -2409,4 +2365,203 @@ ouvrir le lien pour en savoir plus %s, titre + + + Liens + + Liens disponibles + + + + + + Traduire cette page ? + + Essayer les traductions privées de %1$s + + Afin de respecter votre vie privée, les traductions ne quittent jamais votre appareil. De nouvelles langues et des améliorations seront bientôt disponibles ! %1$s + + En savoir plus + + Langue source : + + Langue cible : + + Plus tard + + Terminé + + Traduire + + Veuillez réessayer + + Traduction + + Traduction en cours + + + Un problème s’est produit lors de la traduction. Veuillez réessayer. + + Impossible de charger les langues. Veuillez vérifier votre connexion Internet puis réessayer. + + Désolé, nous ne prenons pas encore en charge cette langue : %1$s. + + En savoir plus + + + + Options de traduction + + Toujours proposer de traduire + + + Toujours traduire les pages en %1$s + + Ne jamais traduire les pages en %1$s + + Ne jamais traduire ce site + + Paramètres de traduction + + À propos des traductions dans %1$s + + + + Traductions + + Proposer de traduire lorsque cela est possible + + Toujours télécharger les langues en mode d’économie de données + + Préférences de traduction + + Traduction automatique + + Ne jamais traduire ces sites + + Télécharger des langues + + + + Traduction automatique + + + Sélectionnez une langue pour gérer les préférences « Toujours traduire » et « Ne jamais traduire ». + + + + Proposer de traduire (par défaut) + + %1$s proposera de traduire les sites dans cette langue. + + Toujours traduire + + %1$s traduira automatiquement la page dans cette langue à son chargement. + + Ne jamais traduire + + %1$s ne proposera jamais de traduire les sites dans cette langue. + + + + Ne jamais traduire ces sites + + Pour ajouter un nouveau site : visitez-le et sélectionnez « Ne jamais traduire ce site » dans le menu des traductions. + + Supprimer %1$s + + Supprimer %1$s ? + + Supprimer + + Annuler + + + + Télécharger des langues + + Téléchargez des langues complètes pour bénéficier de traductions plus rapides et pour traduire hors connexion. %1$s + + En savoir plus + + Langues disponibles + + requis + + %1$s (%2$s) + + Télécharger des langues + + Toutes les langues + + Supprimer + + En cours + + Télécharger + + Sélectionnée + + + Supprimer %1$s (%2$s) ? + + Si vous supprimez cette langue, %1$s la téléchargera partiellement dans votre cache au fur et à mesure de vos demandes de traduction. + + Supprimer toutes les langues (%1$s) ? + + Si vous supprimez toutes les langues, %1$s téléchargera des langues partielles dans votre cache au fur et à mesure de vos demandes de traduction. + + Supprimer + + Annuler + + + Télécharger en mode d’économie de données (%1$s) ? + + Nous téléchargeons partiellement des langues dans votre cache pour que les traductions restent privées. + + Toujours télécharger en mode d’économie de données + + Télécharger + + Télécharger et traduire + + Annuler + + + + Outils de débogage + + Outils d’onglets + + Nombre d’onglets + + Actifs + + Inactifs + + Privés + + Total + + Outil de création d’onglets + + Nombre d’onglets à créer + + Ajouter aux onglets actifs + + Ajouter aux onglets inactifs + + Ajouter aux onglets privés diff --git a/app/src/main/res/values-fur/strings.xml b/app/src/main/res/values-fur/strings.xml index 257a0767a188..c51838da3115 100644 --- a/app/src/main/res/values-fur/strings.xml +++ b/app/src/main/res/values-fur/strings.xml @@ -69,11 +69,6 @@ No sta lassâ segns su chest dispositîf - - %1$s al elimine i cookies, la cronologjie e i dâts dai sîts cuant che tu sieris ducj i barcons privâts. %2$s Cjate te pagjine + + Tradûs pagjine Salve intune racuelte @@ -327,14 +324,8 @@ No cumò - - Rint Firefox il to navigadôr di riferiment Nus plâs tignîti di cont - - Firefox al met lis personis denant dai profits e al difint la tô riservatece blocant lis spiis inter-sît.\n\nPlui informazions su la nestre informative su la riservatece. Il nestri navigadôr, supuartât di une organizazion cence fins di vuadagn, ti jude a blocâ in automatic lis societâts che, di scuindon, a cirin di stâti daûr a ce che tu fasis in rêt.\n\nScuvierç di plui te nestre informative su la riservatece. No cumò - - Passe dal telefon al portatil e contrari Reste cifrât cuant che tu passis di un dispositîf a chel altri - - Cjape lis schedis e lis passwords di altris tiei dispositîfs e ripie lis tôs operazions di dulà che tu lis âs lassadis. Une volte fat l’acès e la sincronizazion, tu stâs tal sigûr. Firefox cripte passwords, segnelibris e ancjemò altri. @@ -358,15 +345,9 @@ Jentre No cumò - - Lis notifichis ti judin a jessi plui produtîf cun Firefox Lis notifichis ti judin a restâ al sigûr cun Firefox - - Mande lis schedis tra dispositîfs, gjestìs i files discjamâts e oten sugjeriments su cemût tirâ fûr il massim di Firefox. Mande in mût sigûr lis schedis tra i tiei dispositîfs e scuvierç altris funzionalitâts pe riservatece in Firefox. @@ -408,8 +389,6 @@ Selezione un - Gjestìs lis scurtis di ricercje - Gjestìs motôrs di ricercje alternatîfs Modifiche i motôrs visibii tal menù di ricercje @@ -423,8 +402,6 @@ Motôrs di ricercje Sugjeriments dai motôrs di ricercje - - Sbare de direzion Preferencis de sbare de direzion @@ -549,14 +526,10 @@ Dut câs al è ancje pussibil che al sedi un tentatîf di atac. Se tu continuis su chest sît web, no tu varessis di inserî nissune informazion sensibile. Se tu continuis, la modalitât dome-HTTPS e vignarà disativade in mût temporani par chest sît. Acessibilitât - - Servidôr personalizât pal account Firefox Servidôr di account Mozilla personalizât Servidôr personalizât par Sync - - Serivdôr par Firefox Account/Sync modificât. La aplicazion e vignarà sierade par aplicâ lis modifichis… Modificât servidôr par account Mozilla e sincronizazion. Daûr a sierâ la aplicazion par aplicâ lis modifichis… @@ -573,8 +546,6 @@ Personalize Jentre par sincronizâ schedis, segnelibris, passwords e altri. - - Account Firefox @@ -591,8 +562,6 @@ Racuelte di dâts Debug di lontan vie USB - - Visualize motôrs di ricercje Mostre sugjeriments di ricercje @@ -724,12 +693,6 @@ Esplore i components adizionâi - - - Il component adizionâl nol è supuartât - - Il component adizionâ al è za instalât - I components adizionâi a son disativâts in mût temporani @@ -1368,6 +1331,11 @@ Siere lis schedis privadis + + + Sierâ lis schedis privadis? + Tocje o fâs scori cheste notifiche par sierâ lis schedis privadis. + Comercializazion Isole i cookies inter-sît + + Dîs ai sîts web di no condividi o vendi dâts Contignûts che a spiin @@ -1935,28 +1905,18 @@ Zonte gnûf motôr di ricercje Modifiche motôr di ricercje - - Zonte - - Salve Modifiche Elimine - - Altri Non - - Non Non dal motôr di ricercje URL de stringhe di ricercje - Stringhe di ricercje di doprâ - URL di doprâ pe ricercje Sostituìs il test de ricercje cun “%s”. Esempli:\nhttps://www.google.com/search?q=%s @@ -2176,8 +2136,6 @@ - Verifiche recensions - Verifiche recensions Recensions afidabilis @@ -2190,7 +2148,9 @@ Valutazion retificade - Recensions inafidabilis gjavadis + Recensions inafidabilis gjavadis + + Basât su recensions afidabilis In evidence da lis recensions resintis @@ -2203,14 +2163,10 @@ Recensions afidabilis. O crodìn che lis recensions a rivedin cun buine probabilitât di clients vêrs che a àn lassât recensions onestis e imparziâls. - - O crodìn che lis recensions a sedin afidabilis. O crodìn che e sedi une misture di recensions afidabilis e inafidabilis. Recensions inafidabilis. O crodìn che lis recensions a sedin falsis o che a rivedin di recensôrs di part. - - O crodìn che lis recensions no sedin afidabilis. valutazion retificade si base dome su recensions che o crodìn afidabilis.]]> @@ -2227,8 +2183,6 @@ Mostre anunzis te verifiche recensions - Tu viodarâs publicitâts ocasionâls pai prodots pertinents. Ducj i anunzis a scugnin sodifâ i nestris standards di cualitât pes recensions. %s - Di cuant in cuant tu viodarâs anuncis par prodots pertinents. O promovìn dome prodots cun recensions afidabilis. %s Plui informazions @@ -2254,24 +2208,24 @@ A pene che chest prodot al varà plui recensions, o rivarìn a verificâ la lôr cualitât. - Il prodot nol è disponibil + Il prodot nol è disponibil - Se tu viodis che chest prodot al è di gnûf disponibil, visinus cuntune segnalazion e nô o lavorarìn par verificâ lis recensions. - - Segnale che chest prodot al è di gnûf disponibil + Se tu viodis che chest prodot al è di gnûf disponibil, visinus cuntune segnalazion e nô o lavorarìn par verificâ lis recensions. - Segnale che il prodot al è disponibil + Segnale che il prodot al è disponibil - Daûr a verificâ la cualitât recensions + Daûr a verificâ la cualitât recensions - Daûr a verificâ la cualitât recensions + Daûr a verificâ la cualitât recensions + + Verifiche cualitât recensions (%s) Cheste operazion e podarès puartâ vie cirche 60 seconts. - Graciis pe segnalazion! + Graciis pe segnalazion! - O varessin di vê informazions su lis recensions di chest prodot dentri di 24 oris. Torne controle plui tart. + O varessin di vê informazions su lis recensions di chest prodot dentri di 24 oris. Torne controle plui tart. Impussibil verificâ chestis recensions @@ -2313,17 +2267,17 @@ Plui informazions - Selezionant “Sì, provilu” tu acetis la %2$s e i %3$s di %1$s di Mozilla. + Selezionant “Sì, provilu” tu acetis la %2$s e i %3$s di %1$s di Mozilla. - Selezionant “Sì, provilu” tu acetis lis cundizions di %1$s: + Selezionant “Sì, provilu” tu acetis lis cundizions di %1$s: - informative su la riservatece + informative su la riservatece - Informative su la riservatece + Informative su la riservatece - tiermins di utilizazion + tiermins di utilizazion - Cundizions di utilizazion dal servizi + Cundizions di utilizazion dal servizi Sì, provilu @@ -2360,6 +2314,9 @@ Competitivitât + + “%s” + comprim @@ -2377,4 +2334,208 @@ vierzi il colegament par savê di plui %s, intestazion + + + Colegaments + + Colegaments disponibii + + + + + + Voltâ cheste pagjine? + + Prove lis traduzions privadis in %1$s + + Pe tô riservatece, lis traduzions no lassaran mai il to dispositîf. Gnovis lenghis e mioraments a son daûr a rivâ! %1$s + + Plui informazions + + Tradûs di + + Tradûs par + + No cumò + + Fat + + Volte + + Torne prove + + Daûr a tradusi + + Traduzion in cors + + + Al è vignût fûr un probleme tal tradusi. Torne prove. + + Impussibil cjariâ lis lenghis. Controle la tô conession a internet e torne prove. + + + Nus displâs, %1$s nol è ancjemò supuartât. + + Plui informazions + + + + Opzions di traduzion + + Propon simpri la traduzion + + Tradûs simpri dal %1$s + + No sta tradusi mai dal %1$s + + No sta voltâ mai chest sît + + Impostazions di traduzion + + Informazions su lis traduzions in %1$s + + + + Traduzions + + Propon la traduzion se pussibil + + In modalitât sparagn dâts, discjame simpri lis lenghis + + Preferencis di traduzion + + Traduzion automatiche + + No sta tradusi mai chescj sîts + + Discjame lenghis + + + + Traduzion automatiche + + Selezione une lenghe par gjestî lis preferencis ”tradûs simpri“ e ”no sta tradusi mai“. + + + + Propon la traduzion (predefinide) + + %1$s al proponarà la traduzion pai sîts in cheste lenghe. + + Tradûs simpri + + %1$s al tradusarà in automatic cheste lenghe al cjariament de pagjine. + + No sta tradusi mai + + %1$s nol proponarà mai la traduzion pai sîts in cheste lenghe. + + + + No sta tradusi mai chescj sîts + + Par zontâ un gnûf sît: visitilu e selezione “No sta tradusi mai chest sît” dal menù di traduzion. + + Gjave %1$s + + Eliminâ %1$s? + + Elimine + + + Anule + + + + Discjame lenghis + + Discjame lis lenghis completis par tradusi in mût plui svelt e cence vê bisugne di une conession a internet. %1$s + + Plui informazions + + Lenghis disponibilis + + obligatorie + + %1$s (%2$s) + + Discjame lenghis + + Dutis lis lenghis + + Elimine + + In cors + + Discjame + + Selezionade + + + Eliminâ %1$s (%2$s)? + + + Se tu eliminis cheste lenghe, %1$s al discjamarà lenghis parziâls te tô memorie cache intant che tu tradusis. + + Eliminâ dutis lis lenghis (%1$s)? + + + Se tu eliminis dutis lis lenghis, %1$s al discjariarà lenghis parziâls te tô memorie cache intant che tu tradusis. + + Elimine + + Anule + + + Discjariâ se in modalitât sparagn dâts (%1$s)? + + O discjamìn lenghis parziâls te tô memorie cache par tignî privadis lis traduzions. + + Discjame simpri in modalitât sparagn dâts + + Discjame + + + Discjame e volte + + Anule + + + + Struments di debug + + Torne indaûr + + Struments des schedis + + Conte des schedis + + Ative + + Inative + + Privade + + Totâl + + Strument pe creazion di schedis + + Numar di schedis di creâ + + Zonte a schedis ativis + + Zonte a schedis inativis + + Zonte a schedis privadis diff --git a/app/src/main/res/values-fy-rNL/strings.xml b/app/src/main/res/values-fy-rNL/strings.xml index a58d89b17146..9307c57c6f8c 100644 --- a/app/src/main/res/values-fy-rNL/strings.xml +++ b/app/src/main/res/values-fy-rNL/strings.xml @@ -70,11 +70,6 @@ Lit gjin spoaren efter op dit apparaat - - %1$s wisket jo cookies, skiednis en websitegegevens as jo al jo priveefinsters slute. %2$s Sykje op side + + Side oersette Yn kolleksje bewarje @@ -332,14 +329,8 @@ No net - - Meitsje Firefox jo ‘gean nei’-browser Wy hâlde jo graach feilich - - Firefox pleatst minsken boppe winst en ferdigenet jo privacy troch cross-sitetrackers te blokkearjen.\n\nMear ynfo yn ús privacyferklearing. Us troch in non-profitorganisaasje stipe browser helpt foar te kommen dat bedriuwen jo stikem folgje op ynternet.\n\nMear ynfo yn ús privacyferklearring. No net - Ljep fan telefoan nei laptop en werom - Bliuw fersifere wannear’t jo fan apparaat wikselje - - Pik ljepblêden en wachtwurden op fan jo oare apparaten om fierder te gean wêr’t jo bleaun wiene. Wannear’t jo oanmeld en syngronisearre binne, binne jo feiliger. Firefox fersiferet jo wachtwurden, blêdwizers en mear. @@ -362,15 +349,9 @@ Oanmelde No net - - Meldingen helpe jo mear te dwaan mei Firefox Meldingen helpe jo feiliger te bliuwen mei Firefox - - Ferstjoer ljepblêden tusken apparaten, behear downloads en ûntfang tips om Firefox optimaal te brûken. Ferstjoer feilich ljepblêden tusken jo apparaten en ûntdek oare privacyfunksjes yn Firefox. @@ -412,8 +393,6 @@ Selektearje ien - Sykfluchkeppelingen beheare - Alternative sykmasinen beheare Yn it sykmenu sichtbere sykmasinen bewurkje @@ -427,8 +406,6 @@ Sykmasinen Suggestjes fan sykmasinen - - Adresbalke Adresbalkefoarkarren @@ -550,14 +527,10 @@ It is lykwols ek mooglik dat der in oanfaller by belutsen is. As jo trochgean nei de webside, moatte jo gjin gefoelige ynformaasje ynfiere. As jo trochgean, sil Allinnich-HTTPS-modus tydlik útskeakele wurde foar de website. Tagonklikheid - - Oanpaste Firefox Accountserver Oanpaste Mozilla-accountserver Oanpaste Syncserver - - Firefox Account-/Syncserver oanpast. Tapassing wurdt ôfsluten om wizigingen ta te passen… Mozilla-account-/Syngronisaasjeserver oanpast. Tapassing wurdt ôfsluten om wizigingen ta te passen… @@ -575,8 +548,6 @@ Meld jo oan om jo ljepblêden, blêdwizers, wachtwurden en mear te syngronisearjen. - Firefox-account - Mozilla-account Ferbyn opnij om de syngronisaasje te ferfetsjen @@ -588,8 +559,6 @@ Gegevenssamling Remote debugging fia USB - - Sykmasinen toane Syksuggesjes toane @@ -721,12 +690,6 @@ Add-ons ferkenne - - - Add-on wurdt net stipe - - Add-on is al ynstallearre - Add-ons binne tydlik útskeakele @@ -1357,6 +1320,11 @@ Priveeljepblêden slute + + + Priveeljepblêden slute? + Tik of fei dizze melding om priveeljepblêden te sluten. + Marketing @@ -1593,6 +1561,8 @@ Alle cookies (sil derfoar soargje dat websites net goed wurkje) Cross-sitecookies isolearje + + Websites fertelle gegevens net te ferkeapjen en te dielen Folchynhâld @@ -1933,28 +1903,18 @@ Nije sykmasine tafoegje Sykmasine bewurkje - - Tafoegje - - Bewarje Bewurkje Fuortsmite - - Oars Namme - - Namme Namme fan sykmasine Sykterm-URL - Te brûken sykterm - Foar de sykopdracht te brûken URL Sykfraach ferfange troch ‘%s’. Bygelyks: \nhttps://www.google.com/search?q=%s @@ -2185,8 +2145,6 @@ - Beoardielingskontrôle - Beoardielingskontrôle Betroubere beoardielingen @@ -2199,7 +2157,9 @@ Oanpaste wurdearring - Unbetroubere beoardielingen fuortsmiten + Unbetroubere beoardielingen fuortsmiten + + Basearre op betroubere beoardielingen Hichtepunten út resinte beoardielingen @@ -2211,14 +2171,10 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen letterwearde fan A oant F.]]> Betroubere beoardielingen. Wy leauwe dat de beoardielingen wierskynlik ôfkomstich binne fan echte klanten dy’t earlike, ûnpartidige beoardielingen efterlitten hawwe. - - Wy tinke dat de beoardielingen betrouber binne. Wy leauwe dat der in miks is fan betroubere en ûnbetroubere beoardielingen. Unbetroubere beoardielingen. Wy leauwe dat de beoardielingen wierskynlik nep binne of fan befoaroardiele beoardielers. - - Wy tinke dat de beoardielingen net betrouber binne. oanpaste wurdearring is allinnich basearre op beoardielingen wêrfan wy tinke dat se betrouber binne.]]> @@ -2234,8 +2190,6 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen Advertinsjes toane yn beoardielingskontrôle - Jo sjogge sa no en dan advertinsjes foar relevante produkten. Alle advertinsjes moatte foldwaan oan ús kwaliteitsnoarmen foar beoardielingen. %s - Jo sjogge sa no en dan advertinsjes foar relevante produkten. Wy advertearje allinnich foar produkten mei betroubere beoardielingen. %s Mear ynfo @@ -2259,23 +2213,23 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen As dit produkt mear beoardielingen hat, kinne wy harren kwaliteit beoardiele. - Produkt is net beskikber + Produkt is net beskikber - As jo sjogge dat dit produkt wer op foarried is, meld it dan oan ús en wy sille wurkje om de beoardielingen te kontrolearjen. + As jo sjogge dat dit produkt wer op foarried is, meld it dan oan ús en wy sille wurkje om de beoardielingen te kontrolearjen. - Melde dat dit produkt wer op foarried is - - Rapportearje dat produkt op foarried is + Rapportearje dat produkt op foarried is - Beoardielingskwaliteit kontrolearje + Beoardielingskwaliteit kontrolearje - Beoardielingskwaliteit kontrolearje + Beoardielingskwaliteit kontrolearje + + Beoardielingskwaliteit kontrolearje (%s) Dit kin ûngefear 60 sekonden duorje. - Tank foar it melden! + Tank foar it melden! - Wy soene binnen 24 oeren ynfo oer de beoardieling fan dit produkt hawwe moatte. Kom letter noch ris werom. + Wy soene binnen 24 oeren ynfo oer de beoardieling fan dit produkt hawwe moatte. Kom letter noch ris werom. Wy kinne dizze beoardieling net kontrolearje @@ -2314,17 +2268,17 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen Mear ynfo - Troch ‘Ja, probearje’ te selektearjen, geane jo akkoard mei it %2$s en de %3$s fan %1$s troch Mozilla. + Troch ‘Ja, probearje’ te selektearjen, geane jo akkoard mei it %2$s en de %3$s fan %1$s troch Mozilla. - Troch ‘Ja, probearje’ te selektearjen, geane jo akkoard mei it folgjende fan %1$s: + Troch ‘Ja, probearje’ te selektearjen, geane jo akkoard mei it folgjende fan %1$s: - privacybelied + privacybelied - Privacybelied + Privacybelied - brûksbetingsten + brûksbetingsten - Brûkersbetingsten + Brûkersbetingsten Ja, probearje @@ -2360,6 +2314,9 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen Konkurrinsjefermogen + + ‘%s’ + ynklappe @@ -2377,4 +2334,204 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen de keppeling te iepenjen foar mear ynfo %s, koptekst + + + Keppelingen + + Beskikbere keppelingen + + + + + + Dizze side oersette? + + Probearje priveeoersettingen yn %1$s + + Foar jo privacy ferlitte oersettingen jo apparaat nea. Nije talen en ferbetteringen komme gau! %1$s + + Mear ynfo + + Oersette fanút it + + Oersette nei it + + No net + + Dien + + Oersette + + Opnij probearje + + Oersette + + Oersetting wurdt útfierd + + + Der is in probleem bard by it oersetten. Probearje it opnij. + + Kin talen net lade. Kontrolearje jo ynternetferbining en probearje it nochris. + + Sorry, wy stypje %1$s noch net. + + Mear ynfo + + + + Oersetopsjes + + Altyd oanbiede om oer te setten + + %1$s altyd oersette + + %1$s nea oersette + + Dizze website nea oersette + + Oersetynstellingen + + Oer oersettingen yn %1$s + + + + Oersettingen + + Oanbiede om oer te setten wannear mooglik + + Talen altyd downloade yn gegevensbesparringsmodus + + Oersetfoarkarren + + Automatyske oersetting + + Dizze websites nea oersette + + Talen downloade + + + + Automatyske oersetting + + Selektearje in taal om de foarkarren ‘Altyd oersette’ en ‘Nea oersette’ te behearen. + + + + Oanbiede om oer te setten (standert) + + %1$s sil oanbiede om websites yn dizze taal oer te setten. + + Altyd oersette + + %1$s sil dizze taal automatysk oersette as de side laden wurdt. + + Nea oersette + + %1$s sil oanbiede om websites yn dizze taal oer te setten. + + + + Dizze websites nea oersette + + Om in nije website ta te foegjen: besykje dizze en selektearje ‘Dizze website nea oersette’ yn it oersetmenu. + + %1$s fuortsmite + + %1$s fuortsmite? + + Fuortsmite + + Annulearje + + + + Talen downloade + + Download folsleine talen foar rappere oersettingen en offline oer te setten. %1$s + + Mear ynfo + + Beskikbere talen + + fereaske + + %1$s (%2$s) + + Talen downloade + + Alle talen + + Fuortsmite + + Wurdt útfierd + + Downloade + + Selektearre + + + %1$s (%2$s) fuortsmite? + + As jo dizze taal fuortsmite, sil %1$s in part fan de talen nei jo buffer downloade wylst jo oersette. + + Alle talen (%1$s) fuortsmite? + + As jo dizze talen fuortsmite, sil %1$s in part fan de talen nei jo buffer downloade wylst jo oersette. + + Fuortsmite + + Annulearje + + + Downloade yn gegevensbesparringsmodus (%1$s)? + + + Wy downloade in part fan de talen nei jo buffer om oersettingen privee te hâlden. + + Altyd downloade yn gegevensbesparringsmodus + + Downloade + + Downloade en oersette + + Annulearje + + + + Helpmiddelen foar debugge + + Tebek blêdzje + + Ljepblêdhelpmiddelen + + Oantal ljepblêden + + Aktyf + + Ynaktyf + + Privee + + Totaal + + Helpmiddel foar it oanmeitsjen fan ljepblêden + + Oantal oan te meitsjen ljepblêden + + Tafoegje oan aktive ljepblêden + + Tafoegje oan ynaktive ljepblêden + + Tafoegje oan priveeljepblêden diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 84053fc05014..5655ba231ae0 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -516,6 +516,11 @@ Permitir + + %1$s acaba de rexeitar as cookies por ti + + Menos distraccións, menos cookies que te rastrexan neste sitio. + Tenta conectarse automaticamente a sitios mediante o protocolo de cifrado HTTPS para aumentar a seguridade. @@ -623,6 +628,8 @@ Complementos + + Instala o complemento desde o ficheiro Notificacións @@ -2215,8 +2222,6 @@ Anuncio de %s - O comprobador de recensións está impulsado por %s. - O comprobador de recensións está impulsado por %s %s de Mozilla @@ -2276,6 +2281,8 @@ Probar a nosa guía de confianza para recensións de produtos Consultar a fiabilidade das recensións de produtos en %1$s antes de comprar. A verificación de recensións, unha función experimental de %2$s, está integrada directamente no navegador. Tamén funciona en %3$s e %4$s. + + Consulte a fiabilidade das revisións de produtos en %1$s antes de comprar. Review Checker, unha función experimental de %2$s, está integrada directamente no navegador. Usando o poder de %1$s de Mozilla, axudámoslle a evitar recensións tendenciosas e pouco auténticas. O noso modelo de IA está a mellorar sempre para protexelo mentres compra. %2$s @@ -2343,4 +2350,6 @@ ler o artigo abrir a ligazón para saber máis + + %s, Título diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index eb1969b72600..36ffdb6184a3 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -71,12 +71,6 @@ Ani eheja ko mba’e’oka rapykuere - - %1$s ombogue kookie, tembiasakue ha mba’ekuaarã tendápe embotypávo ne rendayke ñemiguáva. %2$s - Eheka kuatiaroguépe + + Emoñe’ẽasa kuatiarogue Eñongatu mbyatyhápe @@ -334,14 +330,8 @@ Ani ko’ág̃a - - Ejapo Firefox-gui kundahára ehayhuvéva Rovy’ã eimére tekorosãme - - Firefox omotenonde avápe viru rovake ha omomba’e nde rekoñemi ojokóvo tapykuehoha tenda pa’ũme.\n\nEñemomaranduve ore ñemurã rupive. Ore kundahára ojeykekóva viru rehegua’ỹva oipytyvõ mba’apohaguasukuéra nde rapykuehóvo ñemihápe ñandutípe.\n\nEikuaavéta ore marandu’i ñemiguápe. Ani ko’ág̃a - Eva pumbyrýgui mohendahápe ha ambueháicha - Eime papapýpe ehasávo ambue mba’e’okápe - - Erujey tendayke ha ñe’ẽñemi ambue mba’e’okágui eku’ejey hag̃ua eheja haguégui. Emoñepyrũvo tembiapo ha ojuehérõ, ne rekorosãvéta. Firefox ombopapapy ñe’ẽñemi, techaukaha ha hetave. @@ -365,15 +351,9 @@ Eñemboheraguapy Ani ko’ág̃a - - Marandu’i ne pytyvõta ejapove hag̃ua Firefox ndive Umi marandu ne pytyvõta eime hag̃ua tekorosãme Firefox ndive - - Emondo tendayke mba’e’oka pa’ũme, eñangareko ñemboguejýre ha ehecháta ñemoñe’ẽ eiporu porã hag̃ua Firefox. Emondo tendayke mba’e’oka pa’ũme tekorosãme ha ehecha ambue Firefox rembiapoite ñemiguáva. @@ -416,8 +396,6 @@ Eiporavo peteĩ - Eñangareko jeheka mbopya’eháre - Eñangareko jehekaha ykepeguávare Embosako’i jehekaha ojekuaáva poravorã jehekahápe @@ -431,8 +409,6 @@ Hekaha mongu’eha Ñemoñe’ẽ hekaharaguáva - - Kundaharape renda Jerohoryvéva kundaharape rendáre @@ -557,14 +533,10 @@ Upéicharamo jepe, ikatu avei peteĩ mba’evaiapoha. Eime meméramo ñanduti rendápe, aníke emoinge marandu emomba’evéva. Eiméramo pype, pe HTTPS ayvu añoite omboguéta sapy’aite pe tendápe g̃uarã. Jeikekuaaha - - Mohendahavusu Firefox Account momba’etepyre Mohendahavusu Mozilla mba’ete mboavapyréva Mohendahavusu Sync momba’etepyre - - Account/Sync mba’ete moambuepyre. Esẽnguévo pe tembiporu’ígui emoambue hag̃ua… Mozilla mba’ete/Sync mohendahavusu moambuepyre. Esẽ tembiporu’ígui iñambue hag̃ua… @@ -582,8 +554,6 @@ Eñepyrũ tembiapo embojuehe hag̃ua tendayke, techaukaha, ñe’ẽñemi ha hetave. - Firefox Account - Mozilla mba’ete Eikejey eñepyrũjey hag̃ua ñembojuehe @@ -595,8 +565,6 @@ Mba’ekuaarã ñembyaty Ñemopotĩ okayguáva USB rupi - - Ehechauka hekaha mongu’eha Ehechauka ñemoñe’ẽ jehekarã @@ -644,6 +612,8 @@ Moĩmbaha + + Emohenda moĩmbaha marandurenda guive Ñemomarandu @@ -730,13 +700,6 @@ Ejepovyvy moĩmbaháre - - - Pe moĩmbaha ndojokupytýi - - - Pe moĩmbaha oñemohendáma - Umi tembiporu’i ojejoko sapy’ami @@ -1387,6 +1350,10 @@ Emboty tendayke ñemigua + + ¿Emboty tendayke ñemigua? + Eikutu ha embosyryry ko marandu’i emboty hag̃ua umi tendayke ñemigua. + Jehepyme’ẽrã @@ -1630,6 +1597,8 @@ Opaite kookie (ikatu ñanduti renda ombyai) Eipe’a kookie tenda ojuasávagui + + Ere ñanduti rendápe ani ovende ha omoherakuã mba’ekuaarã Tetepy rapykueho @@ -1979,28 +1948,18 @@ Embojuaju jehekaha pyahu Embosako’i hekaha - - Mbojuaju - - Ñongatu Mbosako’i Mboguete - - Ambue Téra - - Téra Hekaha mongu’eha réra Jeheka juajuha URL - Jehekaha juajuha eiporútava - URL eiporukuaáva eheka hag̃ua Emoambue porandu “%s” ndive. Techapyrã:https://www.google.com/search?q=%s @@ -2234,8 +2193,6 @@ - Marandu’i rechajeyha - Marandu’i rechajeyha Marandu’i jeroviaha @@ -2248,7 +2205,9 @@ Ñeha’ãmby ha’etéva - Oñemboguéta marandu’i jerovia’ỹha + Oñemboguéta marandu’i jerovia’ỹha + + Oiko hechajey jeroviahápe Mba’e iporãva marandu’i osẽramóvare @@ -2259,14 +2218,10 @@ papapy tai ndive A guive F peve.]]> Hechajey jeroviaha. Roguerovia marandu’i ouha joguaharaitégui ohejáva umi marandu’i oñanduháicha ha ñaña’ỹre. - - Roikuaa marandu’i ejeroviakuaaha. Roikuaa oĩha marandu’i jeroviaha ha jerovia’ỹha. Marandu’i jerovia’iveha. Roikuaa marandu’i ikatuha japu térã ou hechajeyhára iñañávagui. - - Roikuaa marandu’íre ejeroviakuaaha. ñeha’ã oikóva oma’ẽ marandu’i rohecháva ojegueroviaha añoite.]]> @@ -2282,8 +2237,6 @@ Ehechauka ñemurã marandu’i rechajeyhápe - Ehecháta ñemurã sapy’agua apopyre iporãvagui. Opaite ñemurã ojapova’erã oipotaháicha jehechajey porãverã. %s - Ehecháta ñemurã sapy’apy’a apopyre oikóva rehegua. Romoasãi ñemurã apopyre jeroviaha añoite. %s Eikuaave @@ -2307,23 +2260,23 @@ Ko apopyre ojehecha hetajey rire, rohesa’ỹijóta iporãngue. - Apopyre ndojeporukuaái + Apopyre ndojeporukuaái - Ehechárõ ko apopyre ojejoguakuaajeýma, oremomarandu ha romba’apóta hekopyahu hag̃ua ñehesa’ijo. - - Emombe’u ko apopyre ojeporukuaajeymaha + Ehechárõ ko apopyre ojejoguakuaajeýma, oremomarandu ha romba’apóta hekopyahu hag̃ua ñehesa’ijo. - Emomarandu apopyre ojeporukuaaha + Emomarandu apopyre ojeporukuaaha - Ehechajey marandu’i porãngue + Ehechajey marandu’i porãngue - Ehechajey marandu’i porãngue + Ehechajey marandu’i porãngue + + Ehechajey marandu’i porãngue (%s) Kóva ipukukuaa 60 aravo’ive rupi. - ¡Aguyje emomarandúre! + ¡Aguyje emomarandúre! - Oĩva’erã marandu ko apopyre jehechajey rehegua 24 aravo oútavape. Ehechajey uperire. + Oĩva’erã marandu ko apopyre jehechajey rehegua 24 aravo oútavape. Ehechajey uperire. Ndorohechajeykuaái ko marandu’i. @@ -2354,22 +2307,24 @@ Eiporu ore marandu’i jeguataha rechajey jeroviápe Ehechajey iporãha umi marandu’i apopyre rehegua %1$s ndive ejogua mboyve. Pe marandu’i rechajeyha, %2$s mba’epyahúva, ojuaju kundahaite ndive. Avei ojeporu %3$s ha %4$s ndive. + + Ehechajey iporãha umi marandu’i apopyre rehegua %1$s ndive ejogua mboyve. Pe marandu’i rechajeyha, %2$s mba’epyahúva, ojuaju kundahára ndive. Erekóvo tembiporupyahu %1$s Mozilla mba’e, roipytyvõta emboyke hag̃ua marandu’ivai ha hekotee’ỹva. Ore IA iporãmeme ñemo’ã hag̃ua emba’ejogua aja. %2$s Eikuaave - Eiporavóvo “Héẽ, eiporu”, emoneĩ %1$s %2$s-gua ha %3$s Mozilla mba’e. + Eiporavóvo “Héẽ, eiporu”, emoneĩ %1$s %2$s-gua ha %3$s Mozilla mba’e. - Eiporavóvo “H’éẽ, eiporu”, emoneĩ upeigua %1$s mba’áva: + Eiporavóvo “H’éẽ, eiporu”, emoneĩ upeigua %1$s mba’áva: - temiñemi porureko + temiñemi porureko - Temiñemi porureko + Temiñemi porureko - temiñemi jeporurã + temiñemi jeporurã - Jeporurã reko + Jeporurã reko Héẽ, eiporu @@ -2406,6 +2361,9 @@ Katupyryrasa + + “%s” + pa’ãmba @@ -2421,4 +2379,209 @@ emoñe’ẽ jehaipy embojuruja juajuha eikuaave hag̃ua - + + %s, Moakãha + + + Joajuhakuéra + + Juajuhakuéra eiporukuaáva + + + + + + ¿Emoñe’ẽ’asa ko kuatiarogue? + + Emoñe’ẽasa ñemiguáva %1$s-pe + + Nde rekoñemirã, umi moñe’ẽasa nosẽi araka’eve ne mba’e’okágui. ¡Ñe’ẽ pyahu ha mba’eporã tenondeve! %1$s + + Eikuaave + + Emoñe’ẽasa ko + + Emoñe’ẽasa pe + + Ani ko’ág̃a + + Oĩma + + Moñe’ẽasa + + Eha’ãjey + + Amoñe’ẽasahína + + Ñe’ẽasa oñemboguatáva + + + Iñapañuãi emoñe’ẽasakuévo. Eha’ãjey ag̃amieve. + + Nahenyhẽkuaái ñe’ẽnguéra. Ehechajey oikópa ne ñanduti ha eha’ãjey ag̃ave. + + Rombyasy, noroykekói gueteri %1$s. + + Kuaave + + + + Ñe’ẽasa poravopyrã + + Eñekuãve’ẽ emoñe’ẽasa hag̃ua + + Emoñe’ẽasameme %1$s + + Aníke emoñe\'ẽasa %1$s + + Ani emo’ñe’ẽasa ko tenda + + Ñe’ẽasa ñemboheko + + Mo’ñe’ẽasa rehegua %1$s-pe + + + + Ñemoñe’ẽasa + + + Eikuave’ẽ ñemoñe’ẽasa ikatu vove + + + Emboguejy ñe’ẽnguéra mba’ekuaarã poru’iverãme + + Moñe’ẽasa jerohoryvéva + + Moñe’ẽasa ijeheguíva + + Aníke emoñe’ẽasa ko’ã tenda + + Emboguejy ñe’ẽita + + + + Ñe’ẽasa ijeheguíva + + + Eiporavo ñe’ẽ eñangareko hag̃ua umi erohoryvéva “emoñe’ẽasameme” y “ani emoñe’ẽasa”. + + + + Eikuave’ẽ ñe’ẽasa (ypyguáva) + + %1$s oikuave’ẽta tenda moñe’ẽasa ko ñe’ẽme. + + Emoñe’ẽasameme + + %1$s omoñe’ẽasáta ko ñe’ẽ ijeheguiete henyhẽ vove pe kuatiarogue. + + Ani emoñe’ẽasa + + + %1$s noikuave’ẽmo’ãi araka’eve omoñe’ẽasávo tenda ko ñe’ẽme. + + + + Araka’eve ani emoñe’ẽasa ko’ã tenda + + Embojuaju hag̃ua tenda pyahu: eike ha eiporavo “Ani emoñe’ẽasa ko tenda” moñe’ẽasa poravorãme. + + Emboguete %1$s + + ¿Emboguete %1$s? + + Embogue + + Heja + + + + Emboguejy Ñe’ẽ + + Emboguejy ñe’ẽnguéra tuichaháicha emoñe’ẽasa pya’eve hag̃ua ha ñanduti’ỹre. %1$s + + Kuaave + + Ñe’ẽ eiporukuaáva + + tekotevẽva + + %1$s (%2$s) + + Emboguejy Ñe’ẽ + + Opaite ñe’ẽ + + Mboguete + + Oñemohendavahína + + Mboguejy + + Poravopyre + + + ¿Embogue %1$s (%2$s)? + + Emboguéramo ko ñe’ẽ, %1$s omboguejýta ñe’ẽ vore kachépe emoñe’ẽasakuévo. + + ¿Emboguepa ñe’ẽnguéra (%1$s)? + + Emboguéramo ñe’ẽnguéra, %1$s omboguejýta ñe’ẽ vore kachépe emoñe’ẽasakuévo. + + Mboguete + + Heja + + + ¿Emboguejy ñe’ẽnguéra mba’ekuaarã poru’iverãme (%1$s)? + + Romboguejy ñe’ẽnguéra vore kachépe opyta hag̃ua moñe’ẽasa ñemiguáva. + + Emboguejy ñe’ẽnguéra mba’ekuaarã poru’iverãme + + Mboguejy + + Emboguejy ha emoñe’ẽasa + + Heja + + + + Temiporu mopotĩha + + Eikundaha tapykuévo + + Tendayke rembiporu + + Tendayke papapy + + Myandy + + Jokopyre + + Ñemigua + + Opavavete + + Tembiporu tendayke moheñoiha + + Mboýpa emoheñóita tendayke + + Embojuaju tendayke oikóva + + Embojuaju tendayke ojeporu’ỹva + + Embojuaju tendayke ñemiguáva + diff --git a/app/src/main/res/values-hsb/strings.xml b/app/src/main/res/values-hsb/strings.xml index 0e702b688a93..0a156da5d247 100644 --- a/app/src/main/res/values-hsb/strings.xml +++ b/app/src/main/res/values-hsb/strings.xml @@ -69,11 +69,6 @@ Na tutym graće žane slědy njezawostajić - - %1$s waše placki, historiju a sydłowe daty zhaša, hdyž wšě swoje priwatne wokna začinjeće. %2$s Na stronje pytać + + Stronu přełožić Do zběrki składować @@ -329,14 +326,8 @@ Nic nětko - - Wužiwajće Firefox po puću Škitamy was rady - - Firefox ludźi nad dobytki staja a blokuje sydła přesahowace slědowaki, zo by wašu priwatnosć škitał.\n\nDalše informacije w našej zdźělence priwatnosće. Naš powšitkownosći wužitny wobhladowak tomu zadźěwa, zo předewzaća wam skradźu po interneće slěduja.\n\nDalše informacije w našej zdźělence priwatnosće. Nic nětko - Skočće wot smóratka do laptopa a wróćo - Wostańće zaklučowany, hdyž wjacore graty wužiwaće - - Wobstarajće sej rajtarki a hesła z druhich gratow, zo byšće tam pokročował, hdźež sće přestał. Hdyž sće so přizjewił a sće synchronizował, sće wěsćiši. Firefox waše hesła, zapołožki a wjace zaklučuje. @@ -359,15 +346,9 @@ Přizjewić Nic nětko - - Zdźělenki wam pomhaja, wjace z Firefox činić Zdźělenki wam pomhaja, z Firefox wěsćiši wostać - - Sćelće rajtarki mjez gratami, rjadujće sćehnjenja a dóstańće pokiwy, zo byšće najwjace z Firefox wućahnył. Rozsyłajće rajtarki mjez swojimi gratami a wotkryjće druhe funkcije priwatnosće w Firefox. @@ -409,8 +390,6 @@ Wubjerće jednu - Pytanske skrótšenki rjadować - Alternatiwne pytawy rjadować Pytawy wobdźěłać, kotrež su w pytanskim meniju @@ -424,8 +403,6 @@ Pytawy Namjety wot pytawow - - Adresowe polo Nastajenja adresoweho pola @@ -548,14 +525,10 @@ Je pak tež móžno, zo so wo nadběh jedna. Jeli websydło najebać toho wopytujeće, wy njeměł sensibelne informacije zapodać. Jeli pokročujeće, so modus Jenož-HTTPS nachwilu za sydło znjemóžni. Bjezbarjernosć - - Swójski kontowy serwer Firefox Swójski kontowy serwer Mozilla Swójski synchronizowanski serwer - - Kontowy resp. synchronizowanski serwer Firefox je so změnił. Nałoženje so kónči, zo bychu so změny nałožili… Kontowy resp. synchronizowanski serwer Mozilla je so změnił. Nałoženje so kónči, zo bychu so změny nałožili… @@ -573,8 +546,6 @@ Zregistrujće so, zo byšće rajtarki, zapołožki, hesła a dalše synchronizował. - Konto Firefox - Konto Mozilla Zaso zwjazać, zo by ze synchronizaciju pokročowało @@ -586,8 +557,6 @@ Hromadźenje datow Zdalene pytanje zmylkow přez USB - - Pytawy pokazać Pytanske namjety pokazać @@ -720,12 +689,6 @@ Přidatki wuslědźić - - - Přidatk so njepodpěruje - - Přidatk je hižo instalowany. - Přidatki su nachwilu znjemóžnjene @@ -1366,6 +1329,12 @@ Priwatne rajtarki začinić + + + Priwatne rajtarki začinić? + + Podótkńće so tuteje zdźělenki abo jědźće přez nju, zo byšće priwatne rajtarki začinił. + Marketing @@ -1603,6 +1572,8 @@ Wšě placki (budźe zawinować, zo websydła njefunguja) Sydła přesahowace placki izolować + + Websydłam zdźělić, zo nimaja daty dźělić a předać Slědowacy wobsah @@ -1943,29 +1914,19 @@ Nowu pytawu přidać Pytawu wobdźěłać - - Přidać - - Składować Wobdźěłać Zhašeć - - Druhe Mjeno - - Mjeno Mjeno pytawy URL pytanskeho wuraza - Pytanski wuraz, kotryž ma so wužiwać - URL, kotryž so ma za pytanje wužiwać Naprašowanje z „%s“ wuměnić. Přikład: \nhttps://www.google.com/search?q=%s @@ -2194,8 +2155,6 @@ - Kontrola pohódnoćenjow - Kontrola pohódnoćenjow Spušćomne pohódnoćenja @@ -2208,7 +2167,9 @@ Přiměrjene hódnoćenje - Njespušćomne pohódnoćenja wotstronjene + Njespušćomne pohódnoćenja wotstronjene + + Bazuje na spušćomnych pohódnoćenjach Wjerški z najnowšich pohódnoćenjow @@ -2220,14 +2181,10 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk pismikowu znamku wot A do F.]]> Spušćomne pohódnoćenja. Myslimy sej, zo pohódnoćenja su najskerje wot woprawdźitych kupcow, kotřiž su sprawne, bjezpředsudne pohódnoćenja zawostajili. - - Wěrimy, zo pohódnoćenja su spušćomne. Wěrimy, zo je měšeńca spušćomnych a njespušćomnych pohódnoćenjow. Njespušćomne pohódnoćenja. Myslimy sej, zo pohódnoćenja su najskerje sfalšowane abo wot pohódnoćowacych z předsudkami. - - Wěrimy, zo pohódnoćenja spušćomne njejsu. Přiměrjene hódnoćenje jenož na pohódnoćenjach bazuje, kotrež mamy za spušćomne.]]> @@ -2243,8 +2200,6 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk Wabjenje w kontroli pohódnoćenjow pokazać - Budźeće hdys a hdys wabjenje za relewantne produkty widźeć. Wšě wabjenske anonsy dyrbja našim standardam za kwalitu pohódnoćenjow wotpowědować. %s - Budźeće hdys a hdys wabjenje za relewantne produkty widźeć. Wabimy jenož za produkty ze spušćomnymi pohódnoćenjemi. %s Dalše informacije @@ -2267,23 +2222,23 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk Hdyž tutón produkt ma wjace pohódnoćenjow, móžemy jich kwalitu kontrolować. - Produkt k dispoziciji njeje + Produkt k dispoziciji njeje - Jeli widźiće, zo tutón produkt je zaso na składźe, zdźělće to a budźemy na kontrolowanju pohódnoćenjow dźěłać. + Jeli widźiće, zo tutón produkt je zaso na składźe, zdźělće to a budźemy na kontrolowanju pohódnoćenjow dźěłać. - Zdźělić, zo tutón produkt je zaso na składźe - - Zdźělić, zo produkt je na składźe + Zdźělić, zo produkt je na składźe - Kontrola kwalitu pohódnoćenjow + Kontrola kwalitu pohódnoćenjow - Kontrola kwalitu pohódnoćenjow + Kontrola kwalitu pohódnoćenjow + + Kontrola kwalitu pohódnoćenjow (%s) To móhło na 60 sekundow trać. - Wulki dźak za zdźělenku! + Wulki dźak za zdźělenku! - My dyrbjeli w běhu 24 hodźin informacije wo pohódnoćenjach tutoho produkta měć. Přińdźće prošu nimo. + My dyrbjeli w běhu 24 hodźin informacije wo pohódnoćenjach tutoho produkta měć. Přińdźće prošu nimo. Njemóžemy tute pohódnoćenja přepruwować @@ -2321,17 +2276,17 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk Dalše informacije - Hdyž „Haj, wupruwować“ wuběraće, zwoliće do %2$s a %3$s Mozilla za %1$s. + Hdyž „Haj, wupruwować“ wuběraće, zwoliće do %2$s a %3$s Mozilla za %1$s. - Hdyž „Haj, wupruwować“ wuběraće, zwoliće do slědowaceho wot %1$s: + Hdyž „Haj, wupruwować“ wuběraće, zwoliće do slědowaceho wot %1$s: - prawidła priwatnosće + prawidła priwatnosće - Prawidła priwatnosće + Prawidła priwatnosće - wužiwanske wuměnjenja + wužiwanske wuměnjenja - Wužiwanske wuměnjenja + Wužiwanske wuměnjenja Haj, wupruwować @@ -2368,6 +2323,9 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk Wubědźowanjakmanosć + + „%s“ + schować @@ -2385,4 +2343,205 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk wotkaz wočinić, zo byšće wjace zhonił %s, nadpismo + + + Wotkazy + + Wotkazy, kotrež su k dispoziciji + + + + + + Tutu stronu přełožować? + + Priwatne přełožki w %1$s testować + + Za wašu priwatnosć přełožki waš grat ženje njewopušćeja. Nowe rěče a polěpšenja bórze přińdu! %1$s + + Dalše informacije + + Žórłowa rěč + + Cilowa rěč + + Nic nětko + + Dokónčene + + Přełožić + + Hišće raz spytać + + Přełožowanje + + Přełoženje běži + + + Při přełožowanju je problem nastał. Prošu spytajće hišće raz. + + Rěče njedadźa so začitać. Přepruwujće swój internetny zwisk a spytajće hišće raz. + + %1$s bohužel hišće njepodpěrujemy. + + Dalše informacije + + + + Přełožowanske nastajenja + + Přełožk přeco poskićić + + Přeco přełožić: %1$s + + Ženje njepřełožować: %1$s + + Tute websydło ženje njepřełožić + + Přełožowanske nastajenja + + Wo přełožkach w %1$s + + + + Přełožki + + Přełožowanje poskićić, hdyž móžno + + Rěče přeco w datowym lutowanskim modusu sćahnyć + + Přełožowanske nastajenja + + Awtomatiske přełožowanje + + Tute websydła ženje njepřełožić + + Rěče sćahnyć + + + + Awtomatiske přełožowanje + + + Wubjerće rěč, zo byšće nastajeni „přeco přełožić“ a „ženje njepřełožić“ rjadował. + + + + Přełožk poskićić (standard) + + %1$s poskići, sydła do tuteje rěče přełožować. + + Přeco přełožić + + %1$s budźe tutu rěč awtomatisce přełožować, hdyž so strona začita. + + Ženje njepřełožować + + + %1$s ženje njeposkića, sydła do tuteje rěče přełožować. + + + + Tute websydła ženje njepřełožić + + Zo byšće nowe sydło přidał: Wopytajće jo a wubjerće „Tute sydło ženje njepřełožić“ z přełožowanskeho menija. + + %1$s wotstronić + + %1$s zhašeć? + + Zhašeć + + Přetorhnyć + + + + Rěče sćahnyć + + Sćehńće dospołne rěče za spěšniše přełožki a zo byšće offline přełožował. %1$s + + Dalše informacije + + K dispoziciji stejace rěče + + trěbny + + %1$s (%2$s) + + Rěče sćahnyć + + Wšě rěče + + Zhašeć + + Běži + + Sćahnyć + + Wubrany + + + %1$s (%2$s) zhašeć? + + Jeli tutu rěč zhašeće, %1$s dźělne rěče do wašeho cache sćehnje, hdyž přełožujeće. + + Wšě rěče (%1$s) zhašeć? + + Jeli wšě rěče zhašeće, %1$s dźělne rěče do wašeho cache sćehnje, hdyž přełožujeće. + + Zhašeć + + Přetorhnyć + + + W datowym lutowanskim modusu sćahnyć (%1$s)? + + Sćahujemy dźělne rěče do wašeho cache, zo byšće přełožki priwatne dźerželi. + + Přeco w datowym lutowanskim modusu sćahnyć + + Sćahnyć + + Sćahnyć a přełožić + + Přetorhnyć + + + + Nastroje za rozrisanje problemow + + Wróćo nawigěrować + + Rajtarkowe nastroje + + Ličba rajtarkow + + Aktiwny + + Njeaktiwny + + Priwatny + + Dohromady + + Nastroj za wutworjenje rajtarkow + + Ličba rajtarkow, kotrež so maja wutworić + + Aktiwnym rajtarkam přidać + + Njeaktiwnym rajtarkam přidać + + Priwatnym rajtarkam přidać diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 58f7de0c4a58..2557530b8b9c 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -69,11 +69,6 @@ Ne hagyjon nyomot ezen az eszközön - - A %1$s törli a sütiket, előzményeket és oldaladatokat, amikor bezárja az összes privát ablakot. %2$s Keresés az oldalon + + Oldal fordítása Gyűjteménybe mentés @@ -332,14 +329,8 @@ Most nem - - Legyen a Firefox a szokásos böngészője Szeretjük biztonságban tartani Önt - - A Firefox az embereket helyezi a profit elé, és a webhelyek közötti nyomkövetők blokkolásával védi az Ön adatait.\n\nTovábbi információk az adatvédelmi nyilatkozatban találhatók. A nonprofit szervezet által támogatott böngészőnk segít megakadályozni, hogy a cégek titokban nyomon kövessék Önt az interneten.\n\nTovábbi információk az adatvédelmi nyilatkozatban találhatók. Most nem - Váltson át a telefonról a laptopra és vissza - Maradjon titkosítva, amikor az eszközök között vált - - Vegye át a lapokat és a jelszavakat a többi eszközéről, hogy ott folytassa, ahol abbahagyta. Ha be van jelentkezve és szinkronizálva van, akkor nagyobb biztonságban van. A Firefox titkosítja a jelszavait, könyvjelzőit és egyebeit. @@ -362,15 +349,9 @@ Bejelentkezés Most nem - - Az értesítések segítségével még többet tehet a Firefoxszal Az értesítések segítségével nagyobb biztonságban lehet a Firefoxszal - - Küldjön lapokat az eszközök között, kezelje a letöltéseket, és kapjon tippeket arról, hogyan hozza ki a legtöbbet a Firefoxból. Küldjön biztonságosan lapokat eszközei között, és fedezzen fel más adatvédelmi funkciókat a Firefoxban. @@ -412,8 +393,6 @@ Válasszon egyet - Keresési gyorsparancsok kezelése - Alternatív keresőszolgáltatások kezelése A keresés menüben látható keresőszolgáltatások szerkesztése @@ -427,8 +406,6 @@ Keresőszolgáltatások Javaslatok a keresőszolgáltatásoktól - - Címsáv Címsáv beállításai @@ -550,14 +527,10 @@ Az is lehetséges azonban, hogy egy támadó van a dologban. Ha továbblép a webhelyre, ne adjon meg semmilyen bizalmas információt. Ha folytatja, a Csak HTTPS mód ideiglenesen ki lesz kapcsolva a webhelyen. Akadálymentesítés - - Egyéni Firefox-fiókkiszolgáló Egyéni Mozilla-fiókkiszolgáló Egyéni Sync kiszolgáló - - A Firefox-fiók/Sync-kiszolgáló módosítva. Kilépés az alkalmazásból a változások érvényesítéséhez… A Mozilla-fiók/Sync-kiszolgáló módosítva. Kilépés az alkalmazásból a változások érvényesítéséhez… @@ -575,8 +548,6 @@ Jelentkezzen be a lapok, könyvjelzők, jelszavak és sok más szinkronizálásához. - Firefox-fiók - Mozilla-fiók Újracsatlakozás a szinkronizálás folytatásához @@ -588,8 +559,6 @@ Adatgyűjtés Távoli hibakeresés USB-n - - Keresőszolgáltatások megjelenítése Keresési javaslatok @@ -723,12 +692,6 @@ Kiegészítők felfedezése - - - A kiegészítő nem támogatott - - A kiegészítő már telepítve van. - A kiegészítők ideiglenesen le vannak tiltva @@ -1609,6 +1572,8 @@ Összes süti (egyes weboldalakon hibát fog okozni) Webhelyek közötti sütik elkülönítése + + Megmondás a webhelyeknek, hogy ne adják el vagy osszák meg az adatait Nyomkövető tartalom @@ -1948,28 +1913,18 @@ Új keresőszolgáltatás hozzáadása Keresőszolgáltatás szerkesztése - - Hozzáadás - - Mentés Szerkesztés Törlés - - Egyéb Név - - Név Keresőszolgáltatás neve Kereső webcíme - Használandó keresőkifejezés - A kereséshez használandó webcím A keresés cseréje erre: „%s”. Példa:\nhttps://www.google.com/search?q=%s @@ -2199,8 +2154,6 @@ - Értékelés-ellenőrző - Értékelés-ellenőrző Megbízható értékelések @@ -2213,7 +2166,9 @@ Módosított értékelés - A nem megbízható értékelések eltávolítva + A nem megbízható értékelések eltávolítva + + Megbízható értékelések alapján Kiemelések a legutóbbi értékelésekből @@ -2224,14 +2179,10 @@ betűvel megadott osztályzatot rendelünk, A-tól F-ig.]]> Megbízható értékelések. Úgy gondoljuk, hogy az értékelések valószínűleg valódi vásárlóktól származnak, akik őszinte, elfogulatlan értékelést írtak. - - Úgy gondoljuk, hogy az értékelések megbízhatók. Úgy gondoljuk, hogy vegyesen vannak megbízható és nem megbízható értékelések. Nem megbízható értékelések. Úgy gondoljuk, hogy az értékelések hamisak vagy elfogult értékelőktől származnak. - - Úgy gondoljuk, hogy az értékelések nem megbízhatók. módosított értékelés az általunk megbízhatónak gondolt értékelések alapján van számítva.]]> @@ -2247,8 +2198,6 @@ Reklámok megjelenítése az értékelés-ellenőrzőben - Alkalmanként releváns termékek hirdetéseit fogja látni. Minden reklámnak meg kell felelnie az ellenőrzési minőségi követelményeinknek. %s - Alkalmanként releváns termékek hirdetéseit fogja látni. Csak megbízható értékeléssel rendelkező termékeket hirdetünk. %s További tudnivalók @@ -2273,24 +2222,24 @@ Ha több értékelése lesz a terméknek, akkor fogjuk tudni ellenőrizni a minőségüket. - A termék nem érhető el + A termék nem érhető el - Ha úgy látja, hogy a termék újra raktáron van, akkor jelentse, és akkor dolgozni fogunk az értékelések ellenőrzésén. - - Jelentés, hogy a termék újra raktáron van + Ha úgy látja, hogy a termék újra raktáron van, akkor jelentse, és akkor dolgozni fogunk az értékelések ellenőrzésén. - Jelentés, hogy a termék raktáron van + Jelentés, hogy a termék raktáron van - Értékelési minőség ellenőrzése + Értékelési minőség ellenőrzése - Értékelési minőség ellenőrzése + Értékelési minőség ellenőrzése + + Értékelési minőség ellenőrzése (%s) Ez körülbelül 60 másodpercig tarthat. - Köszönjük, hogy jelentette! + Köszönjük, hogy jelentette! - 24 órán belül lesznek információink a termék értékeléseiről. Nézzen vissza később. + 24 órán belül lesznek információink a termék értékeléseiről. Nézzen vissza később. Nem tudjuk ellenőrizni ezeket az értékeléseket @@ -2377,6 +2326,9 @@ Versenyképesség + + „%s” + összecsukás @@ -2394,4 +2346,199 @@ hivatkozás megnyitása, hogy többet tudjon meg %s, címsor + + + + + + Lefordítja az oldalt? + + Próbálja ki a privát fordításokat a %1$sban + + Adatvédelmi okokból a fordítások sosem hagyják el az eszközét. Hamarosan új nyelvek és fejlesztések érkeznek! %1$s + + További tudnivalók + + Fordítás erről: + + Fordítás erre: + + Most nem + + Kész + + Fordítás + + Próbálja újra + + Fordítás + + Fordítás folyamatban + + + Hiba történt a fordítás során. Próbálja meg újra. + + Nem sikerült a nyelvek betöltése. Ellenőrizze az internetkapcsolatát és próbálja újra. + + Sajnos még nem támogatjuk ezt a nyelvet: %1$s. + + További tudnivalók + + + + Fordítási beállítások + + A fordítás felajánlása mindig + + %1$s fordítása mindig + + Soha ne fordítsa ezt: %1$s + + Sose fordítsa le ezt az oldalt + + Fordítási beállítások + + Információk a %1$s fordításairól + + + + Fordítások + + A fordítás felajánlása, ha lehetséges + + A nyelvek letöltése minidig adattakarékos módban + + Fordítás beállításai + + Automatikus fordítás + + + Soha ne fordítsa ezeket az oldalakat + + Nyelvek letöltése + + + + Automatikus fordítás + + + Válasszon nyelvet a „fordítás mindig” és a „sose fordítsa” beállítások kezeléséhez. + + + + Fordítás felajánlása (alapértelmezett) + + + A %1$s felajánlja az ilyen nyelvű oldalak fordítását. + + Fordítás mindig + + A %1$s automatikusan lefordítja ezt a nyelvet az oldalak betöltésekor. + + Sose fordítsa + + A %1$s sosem ajánlja fel az ilyen nyelvű oldalak fordítását. + + + + Sose fordítsa ezeket az oldalakat + + Új oldal hozzáadása: Keresse fel, és válassza a fordítási menü „Sose fordítsa le ezt az oldalt” lehetőségét. + + %1$s eltávolítása + + Törli ezt: %1$s? + + Törlés + + Mégse + + + + Nyelvek letöltése + + Töltsön le teljes nyelveket a gyorsabb és kapcsolat nélküli fordítás érdekében. %1$s + + További tudnivalók + + Elérhető nyelvek + + szükséges + + %1$s (%2$s) + + Nyelvek letöltése + + + Összes nyelv + + Törlés + + Folyamatban + + Letöltés + + Kiválasztva + + + Törli a következőt: %1$s (%2$s)? + + Ha törli ezt a nyelvet, akkor a %1$s fordítás közben tölti le a részleges nyelveket a gyorsítótárába. + + Törli az összes nyelvet (%1$s)? + + Ha törli az összes nyelvet, akkor a %1$s fordítás közben tölti le a részleges nyelveket a gyorsítótárába. + + Törlés + + Mégse + + + Letöltés adattakarékos módban (%1$s)? + + Részleges nyelvek lesznek a gyorsítótárba töltve, hogy a fordítások privátok maradjanak. + + Letöltés mindig adattakarékos módban + + + Letöltés + + Letöltés és fordítás + + Mégse + + + + Lapeszközök + + Lapok száma + + Aktív + + Inaktív + + Privát + + Összesen + + Laplétrehozási eszköz + + Létrehozandó lapok száma + + Hozzáadás az aktív lapokhoz + + Hozzáadás az inaktív lapokhoz + + Hozzáadás a privát lapokhoz diff --git a/app/src/main/res/values-hy-rAM/strings.xml b/app/src/main/res/values-hy-rAM/strings.xml index e1fe61b0ca8c..0db4a05909d1 100644 --- a/app/src/main/res/values-hy-rAM/strings.xml +++ b/app/src/main/res/values-hy-rAM/strings.xml @@ -67,11 +67,6 @@ Այս սարքի վրա հետքեր չթողնել - - %1$s-ը ջնջում է ձեր թխուկները, պատմությունը և կայքի տվյալները, երբ փակում եք ձեր բոլոր մասնավոր պատուհանները: %2$s Գտնել էջում + + Թարգմանել էջը Պահպանել հավաքածուում @@ -328,14 +325,8 @@ Ոչ հիմա - - Դարձրեք Firefox-ը ձեր հիմնական դիտարկիչը Մենք սիրում ենք ձեզ ապահով պահել - - Firefox-ը մարդկանց վեր է դասում շահույթից և պաշտպանում է ձեր գաղտնիությունը՝ արգելափակելով միջկայքի հետագծիչները:\n\nԻմացեք ավելին մեր գաղտնիության ծանուցումներում: Մեր շահույթ չհետապնդող զննարկիչը օգնում է դադարեցնել ընկերություններին գաղտնի հետևել ձեզ համացանցում:\n\nԻմացեք ավելին մեր գաղտնիության ծանուցման մեջ: Ոչ հիմա - Անցեք հեռախոսից նոութբուք և հետ - Մնացեք գաղտնագրված, երբ ցատկում եք սարքերի միջև - - Ձեռք բերեք ներդիրներն ու գաղտնաբառերը ձեր մյուս սարքերից՝ շարունակելու այնտեղից, որտեղ թողել եք: Երբ մուտք եք գործել և համաժամացվել, դուք ավելի ապահով եք: Firefox-ը կոդավորում է ձեր գաղտնաբառերը, էջանիշները և ավելին: @@ -358,15 +345,9 @@ Մուտք գործել Ոչ հիմա - - Ծանուցումներն օգնում են ձեզ ավելին անել Firefox-ի հետ Ծանուցումներն օգնում են ձեզ ավելին անել Firefox-ի հետ - - Ուղարկեք ներդիրներ սարքերի միջև, կառավարեք ներբեռնումները և ստացեք խորհուրդներ Firefox-ից առավելագույնը քաղելու վերաբերյալ: Ապահով ուղարկեք ներդիրներ ձեր սարքերի միջև և հայտնաբերեք գաղտնիության այլ գործառույթներ Firefox-ում: @@ -408,8 +389,6 @@ Ընտրեք մեկը - Կառավարել որոնման դյուրանցումները - Կառավարեք այլընտրանքային որոնիչներ Խմբագրել շարժիչները, որոնք տեսանելի են որոնման ցանկում @@ -423,8 +402,6 @@ Որոնիչներ Առաջարկություններ որոնիչներից - - Հասցեագոտի Հասցեի տողի նախապատվություններ @@ -546,14 +523,10 @@ Այնուամենայնիվ, հնարավոր է նաև, որ հարձակվող է ներգրավված: Եթե շարունակեք այցելել կայք, չպետք է մուտքագրեք որևէ զգայուն տեղեկատվություն: Եթե շարունակեք, ապա կայքի համար ժամանակավորապես կանջատվի միայն HTTPS-ի ռեժիմը: Մատչելիություն - - Ընտրովի Firefox հաշվի սերվեր Mozilla հաշվի հարմարեցված սպասարկիչ Ընտրովի համաժամեցման սերվեր - - Firefox հաշիվը / համաժամեցման սերվերը փոփոխված է: Հայտը դադարեցվում է՝ փոփոխությունները գործադրելու համար… Mozilla հաշիվը/Համաժամեցման սպասարկիչը փոփոխվել են: Դուրս եկեք հավելվածից՝ փոփոխությունները գորխադրելու համար… @@ -571,8 +544,6 @@ Մուտք գործեք՝ ներդիրները, էջանիշերը, գաղտնաբառերը և ավելին համաժամեցնելու համար: - Firefox-ի հաշիվ - Mozilla հաշիվ Կրկին կապակցվեք՝ համաժամեցումը վերսկսելու համար @@ -585,8 +556,6 @@ Տվյալների հավաքագրում Հեռակա վրիպազերծում USB-ով - - Ցուցադրել որոնիչները Ցուցադրել որոնման հուշումներ @@ -717,12 +686,6 @@ Ուսումնասիրեք հավելումները - - - Հավելումը չի աջակցվում - - Հավելումն արդեն տեղադրված է - Հավելումները ժամանակավորապես անջատված են @@ -1358,6 +1321,10 @@ Փակել գաղտնի ներդիրները + + Փակե՞լ գաղտնի ներդիրները + Հպեք կամ սահեցրեք այս ծանուցումը՝ մասնավոր ներդիրները փակելու համար: + Մարկեթինգ @@ -1595,6 +1562,8 @@ Բոլոր cookie-ները (վեբ կայքերի ընդհատման պատճառ կլինեն) Մեկուսացրեք միջկայքային թխուկները + + Կայքերին հաղորդեք, որ չտարածեն և չվաճառեն տվյալները Հետագծվող բովանդակություն @@ -1931,28 +1900,18 @@ Ավելացնել որոնիչ Խմբագրել որոնիչը - - Ավելացնել - - Պահպանել Խմբագրել Ջնջել - - Այլ Անունը - - Անուն Որոնիչի անունը Որոնել տողի URL-ն - Օգտագործվող որոնման տողը - Որոնման համար օգտագործվող URL-ն Հարցումը փոխարինել “%s”-ով: Օրինակ՝ \nhttps://www.google.com/search?q=%s @@ -2181,8 +2140,6 @@ - Վերանայման ստուգիչ - Վերանայել ստուգիչը Հուսալի կարծիքներ @@ -2195,7 +2152,9 @@ Ճշգրտված վարկանիշ - Անվստահելի կարծիքները հեռացվեցին + Անվստահելի կարծիքները հեռացվեցին + + Հուսալի կարծիքների հիման վրա Գունանշումներ վերջին կարծիքներից @@ -2207,14 +2166,10 @@ Հուսալի կարծիքներ: Մենք կարծում ենք, որ կարծիքները, հավանաբար, իրական հաճախորդներից են, ովքեր թողել են ազնիվ, անաչառ կարծիքներ: - - Մենք կարծում ենք, որ կարծիքներն վստահելի են: Մենք հավատում ենք, որ կա հուսալի և անվստահելի կարծիքների խառնուրդ: Անվստահելի կարծիքներ: Մենք կարծում ենք, որ կարծիքները, հավանաբար, կեղծ են կամ կողմնակալ գրախոսների կողմից: - - Մենք կարծում ենք, որ կարծիքներն անվստահելի են: Ճշգրտված վարկանիշը հիմնված է միայն այն կարծիքների վրա, որոնք մենք վստահելի ենք համարում:]]> @@ -2230,8 +2185,6 @@ Ցուցադրել գովազդը կարծիքների ստուգիչում - Դուք երբեմն կտեսնեք համապատասխան ապրանքների գովազդներ: Բոլոր գովազդները պետք է համապատասխանեն կարծիքների որակի մեր չափանիշներին: %s - Դուք երբեմն կտեսնեք համապատասխան ապրանքների գովազդներ: Մենք գովազդում ենք միայն վստահելի կարխիքներով ապրանքներ: %s Իմանալ ավելին @@ -2254,23 +2207,23 @@ Երբ այս ապրանքն ավելի շատ կարծիքներ ունենա, մենք կկարողանանք ստուգել դրանց որակը: - Ապրանքը հասանելի չէ + Ապրանքը հասանելի չէ - Եթե տեսնեք, որ այս ապրանքը կրկին պահեստում է, հաղորդեք դրա մասին, և մենք կաշխատենք ստուգել ակնարկները: + Եթե տեսնեք, որ այս ապրանքը կրկին պահեստում է, հաղորդեք դրա մասին, և մենք կաշխատենք ստուգել ակնարկները: - Հաղորդեք, որ այս ապրանքը կրկին պահեստում է - - Զեկուցված ապրանքը պահեստում է + Զեկուցված ապրանքը պահեստում է - Կարծիքի որակի ստուգում + Կարծիքի որակի ստուգում - Կարծիքի որակի ստուգում + Կարծիքի որակի ստուգում + + Կարծիքի որակի ստուգում (%s) Սա կարող է տևել մոտ 60 վայրկյան: - Շնորհակալություն հայտնելու համար: + Շնորհակալություն հայտնելու համար: - Մենք պետք է 24 ժամվա ընթացքում տեղեկություններ ունենանք այս ապրանքի կարծիքների մասին: Խնդրում ենք նորից ստուգել: + Մենք պետք է 24 ժամվա ընթացքում տեղեկություններ ունենանք այս ապրանքի կարծիքների մասին: Խնդրում ենք նորից ստուգել: Մենք չենք կարող ստուգել այս կարծիքները @@ -2309,17 +2262,17 @@ Իմանալ ավելին - Ընտրելով «Այո, փորձիր»՝ դուք համաձայնում եք %1$s-ը Mozilla-ի կողմիցի %2$s-ին և %3$s-ին: + Ընտրելով «Այո, փորձիր»՝ դուք համաձայնում եք %1$s-ը Mozilla-ի կողմիցի %2$s-ին և %3$s-ին: - Ընտրելով «Այո, փորձիր»՝ դուք ընդունում եք %1$s-ը. + Ընտրելով «Այո, փորձիր»՝ դուք ընդունում եք %1$s-ը. - գաղտնիության դրույթներ + գաղտնիության դրույթներ - Գաղտնիության դրույթներ + Գաղտնիության դրույթներ - օգտվելու կանոններ + օգտվելու կանոններ - Օգտագործման պայմաններ + Օգտագործման պայմաններ Այո, փորձիր @@ -2355,6 +2308,9 @@ Մրցունակություն + + “%s” + Կոծկել @@ -2372,4 +2328,203 @@ բացեք հղումը՝ ավելին իմանալու համար %s, վերնագիր + + + Հղումներ + + Հղումներ են մատչելի + + + + + + Թարգմանե՞լ այս էջը։ + + Փորձեք անձնական թարգմանությունները %1$s-ով + + Ձեր գաղտնիության համար թարգմանությունները երբեք չեն լքում ձեր սարքը: Սպասեք նոր լեզուների և բարելավումների: %1$s + + Իմանալ ավելին + + Թարգմանել հետևյալից՝ + + Թարգմանել հետևյալով՝ + + Ոչ հիմա + + Պատրաստ է + + Թարգմանել + + Կրկին փորձել + + Թարգմանում է + + Թարգմանությունն ընթացքի մեջ է + + + Թարգմանության հետ կապված խնդիր։ Կրկին փորձեք; + + Չհաջողվեց բեռնել լեզուները: Ստուգեք համացանցային կապակցումը և նորից փորձեք: + + Մենք դեռ չենք աջակցում %1$s-ը: + + Իմանալ ավելին + + + + Թարգմանության ընտրանքներ + + Միշտ առաջարկեք թարգմանել + + Միշտ թարգմանել %1$s + + Երբեք չթարգմանել %1$s-ը + + Երբեք չթարգմանել այս կայքը + + Թարգմանության կարգավորումներ + + %1$s-ում թարգմանությունների մասին + + + + Թարգմանություններ + + Հնարավորության դեպքում առաջարկել թարգմանել + + Միշտ ներբեռնեք լեզուներ տվյալների պահպանման կերպում + + Թարգմանության նախապատվություններ + + Ինքնաշխատ թարգմանություն + + Երբեք չթարգմանել այս կայքերը + + Ներբեռնել լեզուներ + + + + Ինքնաշխատ թարգմանություն + + Ընտրեք լեզուն՝ «միշտ թարգմանել» և «երբեք չթարգմանել» նախապատվությունները կառավարելու համար: + + + + Թարգմանելու առաջարկ (սկզբնադիր) + + %1$s-ը կառաջարկի թարգմանել կայքերն այս լեզվով: + + Միշտ թարգմանել + + %1$s-ն ինքնաշխատ կթարգմանի այս լեզուն, երբ էջը բեռնվի: + + Երբեք չթարգմանել + + %1$s-ը երբեք չի առաջարկի թարգմանել կայքերը այս լեզվով: + + + + Երբեք չթարգմանել այս կայքերը + + Նոր կայք ավելացնելու համար այցելեք այն և ընտրեք «Երբեք չթարգմանել այս կայքը» թարգմանության ցանկից: + + Հեռացնել %1$s-ը + + Ջնջե՞լ %1$s-ը: + + Ջնջել + + Չեղարկել + + + + Ներբեռնել լեզուները + + Ներբեռնեք ամբողջական լեզուներ՝ ավելի արագ թարգմանությունների և անցանց թարգմանության համար: %1$s + + Իմանալ ավելին + + Մատչելի լեզուներ + + պահանջվում է + + %1$s (%2$s) + + Ներբեռնել լեզուներ + + Բոլոր լեզուները + + Ջնջել + + Ընթացքում + + Ներբեռնել + + Ընտրված + + + Ջնջե/լ %1$s (%2$s)-ը; + + Եթե ջնջեք բոլոր լեզուները, %1$s-ը, ըստ թարգմանության, շտեմում կներբեռնի մասնակի լեզուներ: + + Ջնջե՞լ բոլոր լեզուները (%1$s): + + Եթե ջնջեք բոլոր լեզուները, %1$s-ը, ըստ թարգմանության, շտեմում կներբեռնի մասնակի լեզուներ: + + Ջնջել + + Չեղարկել + + + Ներբեռնե՞լ, քանի դեռ տվյալների պահպանման կերպում է (%1$s): + + Մենք ներբեռնում ենք մասնակի լեզուներ ձեր շտեմում՝ թարգմանությունները մասնավոր պահելու համար: + + Միշտ ներբեռնել տվյալների պահպանման կերպում + + Ներբեռնել + + Ներբեռնեք և թարգմանել + + Չեղարկել + + + + Վրիպազերծման գործիքներ + + Նավարկել հետ + + Ներդիրի գործիքներ + + Ներդիրների քանակը + + Ակտիվ + + Անգործուն + + Մասնավոր + + Ընդամենը + + Ներդիրների ստեղծման գործիք + + Ներդիրների քանակ ստեղծելու համար + + Հավելել ակտիվ ներդիրներին + + Հավելել ոչ ակտիվ ներդիրներին + + Հավելել մասնավոր ներդիրներին diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 3a9e39aec7c2..0e1bb9ba417e 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -69,11 +69,6 @@ Non lassar tracias sur iste apparato - - %1$s dele tu cookies, chronologia e le datos del sitos web quando tu claude tote le fenestras private. %2$s Cercar in le pagina + + Traducer le pagina Salvar al collection @@ -335,14 +332,8 @@ Non ora - - Face de Firefox tu companion de navigation A nos place mantener te secur - - Firefox antepone le personas al profitos e defende tu confidentialitate blocante traciatores trans-sitos.\n\nPro saper plus nostre aviso de confidentialitate. Nostre navigator supportate per un organisation sin fin de lucro adjuta stoppar le companias de sequer te secretemente per le Web.\n\nSape plus in nostre Aviso de confidentialitate. Non ora - Passa ab le telephono al portabile e retro - Resta cryptate dum tu passa inter tu apparatos - - Recupera schedas e contrasignos ab tu altere apparatos e reprende de ubi tu lassava. Post que tu accedeva e synchronisava, tu es plus secur. Firefox crypta tu contrasignos, marcapaginas, e altero ancora. @@ -366,15 +353,9 @@ Non ora - - Le notificationes te adjuta a facer plus con Firefox Le notificationes te adjuta a star plus secur con Firefox - - Invia schedas inter apparatos, gere downloads, e recipe consilios re obtener le maximo per Firefox. Invia schedas inter tu apparatos e discoperi altere functiones private in Firefox. @@ -415,8 +396,6 @@ Selige uno - Gerer vias breve de recerca - Gerer motores de recerca alternative Modificar motores visibile in le menu de recerca @@ -430,8 +409,6 @@ Motores de recerca Suggestiones ab motores de recerca - - Barra de adresses Preferentias del barra de adresses @@ -557,14 +534,10 @@ Existe totevia le possibilitate que es implicate un attaccante. Si tu continua al sito web, tu deberea evitar de inserer alcun information sensibile. Si tu continua, le modalitate solo HTTPS essera temporarimente disactivate pro iste sito. Accessibilitate - - Servitores de Firefox Account personalisate Servitores de conto Mozilla personalisate Servitor del Sync personalisate - - Servitor de Firefox Account/Sync modificate. Quitante le application pro applicar cambiamentos… Servitor de conto/sync Mozillac modificate. Quitante le application pro applicar cambiamentos… @@ -581,8 +554,6 @@ Personalisar Authentica te pro synchronisar tu schedas, marca-paginas, contrasignos e plus. - - Firefox Account @@ -597,8 +568,6 @@ Collection de datos Depuration remote via USB - - Monstrar motores de recerca Monstrar suggestiones de recerca @@ -730,13 +699,6 @@ Discoperi additivos - - - Le additivo non es supportate - - - Additivo jam installate - Additivos temporarimente disactivate @@ -1402,6 +1364,10 @@ Clauder schedas private + + Clauder schedas private? + Tocca o rola iste aviso pro clauder schedas private. + Marketing @@ -1645,6 +1611,8 @@ Tote le cookies (causara que sitos web collabe) Isolar le cookies inter sitos + + Dicer al sitos web de non compartir ni vender datos Contento traciante @@ -1990,29 +1958,19 @@ Adder un altere motor de recerca Rediger motor de recerca - - Adder - - Salvar Rediger Deler - - Altere Nomine - - Nomine Nomine del motor de recerca URL del stringa de recerca - Catena de recerca a usar - URL a usar pro le recerca Replaciar le recerca con “%s”. Exemplo:\nhttps://www.google.com/search?q=%s @@ -2242,8 +2200,6 @@ - Verificator de recension - Verificator de recension Recensiones fidabile @@ -2256,7 +2212,9 @@ Classification adjustate - Recensiones non fidabile removite + Recensiones non fidabile removite + + Basate sur recensiones fidabile Aspectos notabile ab recensiones recente @@ -2268,14 +2226,10 @@ Recensiones fidabile. Nos crede probabile que le recensiones es de clientes real qui lassava honeste, recensiones sin prejudicios. - - Nos crede que le revisiones es fidabile. Nos crede que il ha un mixtura de recensiones fidabile e non fidabile. Recensiones non fidabile. Nos crede probabile que le recensiones es false o de revisores prevenite. - - Nos crede que le revisiones non es fidabile. classification adjustate es basate solo sur recensiones que nos crede fidabile.]]> @@ -2291,8 +2245,6 @@ Monstrar avisos publicitari in le verificator de recension - Tu videra avisos publicitari occasional pro productos pertinente. Tote le avisos publicitari debe satisfacer nostre standards de qualitate del recensiones. %s - Tu videra avisos occasional de productos relevante. Nos solo avisara productos con revisiones fidabile. %s Saper plus @@ -2315,24 +2267,24 @@ Quando iste producto habera plus de recensiones, nos potera controlar su qualitate. - Le producto non es disponibile + Le producto non es disponibile - Si tu videra que iste producto es retro in stock, reporta lo e nos laborara pro controlar le recensiones. + Si tu videra que iste producto es retro in stock, reporta lo e nos laborara pro controlar le recensiones. - Reporta que iste producto es retro in stock - - Reportar si le producto es in stock + Reportar si le producto es in stock - Controlante qualitate de recension + Controlante qualitate de recension - Controlante qualitate de recension + Controlante qualitate de recension + + Controlante qualitate de recension (%s) Isto pote prender circa 60 secundas. - Gratias pro reportar! + Gratias pro reportar! - Nos deberea haber info re iste recensiones de producto in 24 horas. Controla plus tarde. + Nos deberea haber info re iste recensiones de producto in 24 horas. Controla plus tarde. Nos non pote controlar iste recensiones @@ -2370,17 +2322,17 @@ Pro saper plus - Seligente “Si, prova lo” tu concorda con le %2$s e le %3$s de %1$s per Mozilla. + Seligente “Si, prova lo” tu concorda con le %2$s e le %3$s de %1$s per Mozilla. - Eligente “Si, essaya lo” tu concorda con le sequente ab %1$s: + Eligente “Si, essaya lo” tu concorda con le sequente ab %1$s: - politica de confidentialitate + politica de confidentialitate - Politica de confidentialitate + Politica de confidentialitate - terminos de uso + terminos de uso - Terminos de uso + Terminos de uso Si, essaya lo @@ -2416,6 +2368,9 @@ Competitivitate + + “%s” + contraher @@ -2433,4 +2388,203 @@ aperi le ligamine pro saper plus %s, Titulo + + + Ligamines + + Ligamines disponibile + + + + + + Traducer iste pagina? + + Tentar traductiones private in %1$s + + Pro respectar tu confidentialitate, le traductiones non lassa jammais tu apparato. Nove linguas e meliorationes venira tosto! %1$s + + Pro saper plus + + Traducer ab + + Traducer in + + Non ora + + Facite + + Traducer + + Retentar + + Traduction + + Traduction in curso + + + Il habeva un problema traducente. Retenta. + + Impossibile cargar le linguas. Controla tu connexion a internet e retenta. + + Desolate, nos ancora non supporta %1$s. + + Pro saper plus + + + + Optiones de traduction + + Sempre offerer de traducer + + Sempre traducer %1$s + + Non traducer jammais %1$s + + Non traducer jammais iste sito + + Parametros de traduction + + Re le traduction in %1$s + + + + Traduction + + Offerer le traduction quando possibile + + Sempre discargar linguas in modo sparnio de datos + + Preferentias de traduction + + Traduction automatic + + Non traducer jammais iste sitos + + Discargar linguas + + + + Traduction automatic + + Elige un lingua pro gerer le preferentias “sempre traducer” e “jammais traducer”. + + + + Offerer le traduction (predefinite) + + %1$s offerera de traducer le sitos in iste lingua. + + Sempre traducer + + %1$s traducera iste lingua automaticamente quando le pagina carga. + + Non traduce jammais + + %1$s non offerera jammais de traducer sitos in iste lingua. + + + + Non traduce jammais iste sitos + + Pro adder un nove sito: visita lo e elige “Jammais traduce iste sito” ab le menu de traduction. + + Remover %1$s + + Deler %1$s? + + Deler + + Cancellar + + + + Discargar linguas + + Discarga linguas complete pro traductiones plus veloce e pro traducer sin connexion. %1$s + + Pro saper plus + + Linguas disponibile + + necessari + + %1$s (%2$s) + + Discargar linguas + + Tote le linguas + + Deler + + In curso + + Discargar + + Seligite + + + Deler %1$s (%2$s)? + + Si tu dele iste lingua, %1$s discargara linguas partial a tu cache dum tu traduce. + + Deler tote le linguas (%1$s)? + + Si tu dele tote le linguas, %1$s discargara linguas partial a tu cache dum tu traduce. + + Deler + + Cancellar + + + Discargar dum in modo sparnio de datos (%1$s)? + + Nos discarga linguas partial a tu cache pro mantener private le traductiones. + + Sempre discargar in modo sparnio de datos + + Discargar + + Discargar e traducer + + Cancellar + + + + Utensiles de depuration + + Naviga a retro + + Numero de schedas + + Numero de schedas + + Active + + Inactive + + Private + + Total + + Utensile pro creation de schedas + + Numero de schedas a crear + + Adder a schedas active + + Adder a schedas inactive + + Adder a schedas private diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 8252aa0efee8..49b07f1a8a9c 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -69,11 +69,6 @@ Skilja engin ummerki eftir á þessu tæki - - %1$s eyðir vefkökunum þínum, vafurferli og gögnum vefsvæðisins þegar þú lokar öllum huliðsgluggum þínum. %2$s - - Gerðu Firefox að aðalvafranum þínum Við fáum kikk út úr því að halda þér öruggum - - Firefox setur fólk framar gróða og ver friðhelgi þína með því að loka fyrir eftirlit á vefsvæðum.\n\nFrekari upplýsingar má sjá á persónuverndarsíðu okkar. Vafrinn okkar, sem ekki er rekinn í hagnaðarskyni, hjálpar til við að koma í veg fyrir að fyrirtæki laumist til að fylgjast með ferðum þínum um vefinn.\n\nFrekari upplýsingar má sjá í persónuverndaryfirlýsingu okkar. Ekki núna - Hoppaðu úr síma yfir í fartölvu og svo aftur til baka - Haltu dulritun þegar þú hoppar á milli tækja - - Gríptu með þér flipa og lykilorð úr hinum tækjunum þínum til að halda áfram þar sem frá var horfið. Þegar þú ert skráð/ur inn og með samstillingu í gangi, ertu öruggari. Firefox dulritar lykilorðin þín, bókamerki og fleira. @@ -359,15 +344,9 @@ Skrá inn Ekki núna - - Tilkynningar hjálpa þér að gera meira með Firefox Tilkynningar hjálpa þér að vera öruggari í Firefox - - Sendu flipa á milli tækja, stýrðu niðurhali og fáðu ráð til að fá sem mest út úr Firefox. Sendu flipa á öruggan hátt á milli tækjanna þinna og uppgötvaðu aðra persónuverndareiginleika í Firefox. @@ -410,8 +389,6 @@ Veldu eina - Sýsla með flýtilykla fyrir leit - Sýslaðu með aðrar leitarvélar Breyta leitarvélum sem eru sýnilegar í leitarvalmyndinni @@ -425,8 +402,6 @@ Leitarvélar Tillögur frá leitarvélum - - Staðsetningarslá Kjörstillingar vistfangastiku @@ -549,14 +524,10 @@ Hins vegar er líka mögulegt að árás hafi verið gerð. Ef þú heldur áfram á vefsvæðið ættir þú ekki að setja inn neinar viðkvæmar upplýsingar. Ef þú heldur áfram verður slökkt tímabundið á Einungis-HTTPS-ham fyrir vefsvæðið. Aðgengileiki - - Sérsniðinn netþjónn fyrir Firefox miðlarareikning Sérsniðinn netþjónn fyrir Mozilla-aðganga Sérsniðinn samstillingarþjónn - - Firefox reikningi / samstillingarþjóni hefur verið breytt. Slekk á forritinu til að innleiða breytingar… Mozilla-reikningi / samstillingarþjóni hefur verið breytt. Slekk á forritinu til að innleiða breytingar… @@ -574,8 +545,6 @@ Skráðu þig inn til að samstilla flipana þína, bókamerki, lykilorð og fleira. - Firefox reikningur - Mozilla-reikningur Tengjast aftur til að halda áfram með samstillingu @@ -587,8 +556,6 @@ Gagnasöfnun Kembt með fjartengingu með USB tengi - - Sýna leitarvélar Sýna leitartillögur @@ -719,12 +686,6 @@ Skoða viðbætur - - - Viðbót er ekki studd - - Viðbót er þegar uppsett - Viðbætur eru tímabundið óvirkar @@ -1593,6 +1554,8 @@ Allar vefkökur (munu valda því að vefsíður hrynji) Einangraðu milli-vefsvæða-vefkökur + + Segja vefsvæðum að selja ekki eða deila gögnum Rakið efnið @@ -1929,28 +1892,18 @@ Bæta við nýrri leitarvél Breyta leitarvél - - Bæta við - - Vista Breyta Eyða - - Annað Heiti - - Nafn Heiti leitarvélar Slóð leitarstrengs - Leitarstrengur sem á að nota - Slóð til að nota fyrir leit Skipta út fyrirspurninni með “%s”. Dæmi:\nhttps://www.google.com/search?q=%s @@ -2179,8 +2132,6 @@ - Umsagnaskoðun - Umsagnaskoðun Áreiðanlegar umsagnir @@ -2193,7 +2144,9 @@ Aðlöguð einkunn - Óáreiðanlegar umsagnir fjarlægðar + Óáreiðanlegar umsagnir fjarlægðar + + Byggt á áreiðanlegum umsögnum Hápunktar úr nýlegum umsögnum @@ -2205,14 +2158,10 @@ einkunnir í bókstöfum frá A til F.]]> Áreiðanlegar umsagnir. Við teljum að umsagnirnar séu líklega frá raunverulegum viðskiptavinum sem hafa skilið eftir heiðarlegar og óhlutdrægar umsagnir. - - Við teljum að umsagnirnar séu áreiðanlegar. Við teljum að þarna sé blanda af áreiðanlegum og óáreiðanlegum umsögnum. Óáreiðanlegar umsagnir. Við teljum að umsagnirnar séu líklega falsaðar eða frá hlutdrægum þátttakendum. - - Við teljum að umsagnirnar séu óáreiðanlegar. Aðlöguð einkunn er eingöngu byggð á umsögnum sem við teljum vera áreiðanlegar.]]> @@ -2228,8 +2177,6 @@ Birta auglýsingar í umsagnaskoðun - - Þú munt sjá einstaka auglýsingar fyrir viðeigandi vörur. Allar auglýsingar verða að uppfylla gæðastaðla okkar varðandi umsagnir. %s Þú munt sjá einstaka auglýsingar fyrir viðeigandi vörur. Við auglýsum aðeins vörur með áreiðanlegum umsögnum. %s @@ -2253,23 +2200,23 @@ Þegar þessi vara hefur fleiri umsagnir getum við athugað gæði þeirra. - Vara er ekki fáanleg + Vara er ekki fáanleg - Ef þú sérð að þessi vara er aftur komin á lager skaltu tilkynna það til okkar og við munum vinna að því að uppfæra greininguna. - - Tilkynna að þessi vara sé aftur á lager + Ef þú sérð að þessi vara er aftur komin á lager skaltu tilkynna það til okkar og við munum vinna að því að uppfæra greininguna. - Tilkynna þegar vara er til á lager + Tilkynna þegar vara er til á lager - Athugar gæði umsagna + Athugar gæði umsagna - Athugar gæði umsagna + Athugar gæði umsagna + + Athugar gæði umsagna (%s) Þetta gæti tekið um 60 sekúndur. - Takk fyrir að tilkynna þetta! + Takk fyrir að tilkynna þetta! - Við ættum að vera með uppfærða greiningu innan 24 klukkustunda. Komdu aftur síðar. + Við ættum að vera með uppfærða greiningu innan 24 klukkustunda. Komdu aftur síðar. Við getum ekki athugað þessar umsagnir @@ -2353,6 +2300,9 @@ Samkeppnishæfni + + “%s” + fella saman @@ -2370,4 +2320,173 @@ opnaðu tengilinn til að fræðast nánar %s, Fyrirsögn + + + + + + Þýða þessa síðu? + + Prófaðu einkaþýðingar í %1$s + + Til að verja friðhelgi þína fara þýðingar aldrei út úr tækinu þínu. Ný tungumál og ýmsar endurbætur eru væntanlegar! %1$s + + Kanna nánar + + Þýða úr + + Þýða á + + Ekki núna + + Þýða + + Þýðingar + + Þýðing í gangi + + + + Valkostir þýðinga + + Alltaf bjóðast til að þýða + + Alltaf þýða %1$s + + Aldrei þýða %1$s + + Aldrei þýða þetta vefsvæði + + + Þýðingastillingar + + Um þýðingar í %1$s + + + + Þýðingar + + Bjóðast til að þýða þegar hægt er + + Alltaf sækja tungumál í gagnasparnaðarham + + Valkostir þýðinga + + Sjálfvirk þýðing + + Aldrei þýða þessi vefsvæði + + Sækja tungumál + + + + Sjálfvirk þýðing + + Veldu tungumál til að stjórna stillingum á „alltaf þýða“ og „aldrei þýða“. + + + + Bjóðast til að þýða (sjálfgefið) + + + %1$s mun bjóðast til að þýða vefi á þessu tungumáli. + + Alltaf þýða + + %1$s mun þýða þetta tungumál sjálfkrafa þegar síða hleðst inn. + + Aldrei þýða + + %1$s mun aldrei bjóðast til að þýða vefsvæði á þessu tungumáli. + + + + Aldrei þýða þessi vefsvæði + + Til að bæta við nýju vefsvæði: Farðu á það og veldu „Aldrei þýða þetta vefsvæði“ í þýðingavalmyndinni. + + Fjarlægja %1$s + + Eyða %1$s? + + Eyða + + Hætta við + + + + Sækja tungumál + + Sækja heill tungumál fyrir hraðari þýðingar og til að þýða án nettengingar. %1$s + + Kanna nánar + + Tiltæk tungumál + + nauðsynlegt + + %1$s (%2$s) + + Sækja tungumál + + Öll tungumál + + Eyða + + Í vinnslu + + Sækja + + Valið + + + Eyða %1$s (%2$s)? + + Ef þú eyðir þessu tungumáli, mun %1$s sækja tungumál að hluta í skyndiminnið þitt um leið og þú þýðir. + + Eyða öllum tungumálum (%1$s)? + + Ef þú eyðir öllum tungumálum, mun %1$s sækja tungumál að hluta í skyndiminnið þitt um leið og þú þýðir. + + Eyða + + Hætta við + + + Sækja á meðan verið er í gagnasparnaðarham (%1$s)? + + Við sækjum hluta af tungumálum í skyndiminni til að halda þýðingum leyndum. + + Alltaf sækja í gagnasparnaðarham + + Sækja + + Sækja og þýða + + Hætta við + + + + Flipaverkfæri + + Fjöldi flipa + + Virkir + + Óvirkir + + Huliðs + + Alls diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 4ade559cbd05..13a669b64641 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -70,11 +70,6 @@ Non lasciare tracce su questo dispositivo - - %1$s elimina i cookie, la cronologia e i dati dei siti web quando chiudi tutte le finestre anonime. %2$s Trova nella pagina + + Traduci pagina Salva in una raccolta @@ -335,14 +332,8 @@ Non adesso - - Rendi Firefox il tuo browser di riferimento Ci piace mantenerti al sicuro - - Firefox antepone le persone al profitto e protegge la tua privacy bloccando gli elementi traccianti intersito.\n\n Ulteriori informazioni nella nostra Informativa sulla privacy. Il nostro browser, supportato da un’organizzazione senza fini di lucro, blocca automaticamente le società che, di nascosto, cercano di seguire le tue attività sul Web.\n\nScopri ulteriori informazioni nella nostra informativa sulla privacy. Non adesso - Passa dal computer al telefono, e viceversa - Proteggiti con la crittografia quando passi da un dispositivo all’altro - - Recupera le schede e le password dagli altri dispositivi e riprendi esattamente da dove eri rimasto Una volta eseguito l’accesso e la sincronizzazione, sei più sicuro. Firefox critta password, segnalibri e altro ancora. @@ -365,15 +352,9 @@ Accedi Non adesso - - Le notifiche ti aiutano a ottenere di più da Firefox Le notifiche ti aiutano a rimanere al sicuro con Firefox - - Invia schede tra dispositivi, gestisci download e ricevi suggerimenti su come ottenere il massimo da Firefox. Invia schede in modo sicuro tra i tuoi dispositivi e scopri le altre funzionalità per la privacy di Firefox. @@ -417,8 +398,6 @@ Selezionane uno - Gestisci scorciatoie di ricerca - Gestisci motori di ricerca alternativi Modifica motori visibili nel menu di ricerca @@ -432,8 +411,6 @@ Motori di ricerca Suggerimenti dai motori di ricerca - - Barra degli indirizzi Preferenze della barra degli indirizzi @@ -555,14 +532,10 @@ Esiste tuttavia la possibilità che si tratti di un tentativo di attacco. Se decidi di accedere comunque al sito web, dovresti evitare di inserire informazioni sensibili. Proseguendo, la modalità solo HTTPS verrà temporaneamente disattivata per questo sito. Accessibilità - - Server personalizzato per account Firefox Server personalizzato per account Mozilla Server personalizzato per Sync - - Server per account Firefox/Sync modificato. L’app verrà chiusa per applicare le modifiche… Server per account Mozilla e sincronizzazione modificato. L’app verrà chiusa per applicare le modifiche… @@ -580,8 +553,6 @@ Accedi per sincronizzare schede, segnalibri, password e altro ancora. - Account Firefox - Account Mozilla Riconnetti per riprendere la sincronizzazione @@ -594,8 +565,6 @@ Debug remoto tramite USB - - Visualizza i motori di ricerca Mostra suggerimenti di ricerca @@ -729,12 +698,6 @@ Esplora i componenti aggiuntivi - - - Il componente aggiuntivo non è supportato - - Il componente aggiuntivo è già installato - I componenti aggiuntivi sono temporaneamente disattivati @@ -1393,6 +1356,11 @@ Chiudi le schede anonime + + + Chiudere le schede anonime? + Tocca o fai scorrere questa notifica per chiudere le schede anonime. + Marketing @@ -1635,6 +1603,8 @@ Tutti i cookie (alcuni siti non funzioneranno correttamente) Isola i cookie intersito + + Segnala ai siti web di non vendere o condividere i miei dati Contenuti traccianti @@ -1977,28 +1947,18 @@ Aggiungi nuovo motore di ricerca Modifica motore di ricerca - - Aggiungi - - Salva Modifica Elimina - - Altro Nome - - Nome Nome del motore di ricerca URL della stringa di ricerca - Stringa di ricerca da utilizzare - URL da utilizzare per la ricerca Sostituire la chiave di ricerca con “%s”. Esempio:\nhttps://www.google.com/search?q=%s @@ -2229,8 +2189,6 @@ - Verifica recensioni - Verifica recensioni Recensioni affidabili @@ -2243,7 +2201,9 @@ Valutazione rettificata - Recensioni inaffidabili rimosse + Recensioni inaffidabili rimosse + + Basato su recensioni affidabili In evidenza dalle recensioni recenti @@ -2254,14 +2214,10 @@ voto in lettere dalla A alla F.]]> Recensioni affidabili. Riteniamo che le recensioni provengano con buona probabilità da clienti reali che hanno lasciato recensioni oneste e imparziali. - - Riteniamo che le recensioni siano affidabili. Crediamo che ci sia un misto di recensioni affidabili e inaffidabili. Recensioni inaffidabili. Riteniamo che le recensioni siano false o provenienti da revisori di parte. - - Riteniamo che le recensioni siano inaffidabili. valutazione rettificata si basa esclusivamente su recensioni che riteniamo affidabili.]]> @@ -2277,8 +2233,6 @@ Mostra annunci nella verifica recensioni - Verranno visualizzati annunci occasionali per prodotti pertinenti. Tutti gli annunci devono soddisfare i nostri standard di qualità per le recensioni. %s - Verranno visualizzati annunci occasionali per prodotti pertinenti. Promuoviamo solo prodotti con recensioni affidabili. %s Ulteriori informazioni @@ -2302,24 +2256,24 @@ Non appena questo prodotto avrà più recensioni, saremo in grado di verificarne la qualità. - Il prodotto non è disponibile + Il prodotto non è disponibile - Se noti che questo prodotto è di nuovo disponibile, segnalacelo e lavoreremo per verificarne le recensioni. - - Segnala che questo prodotto è di nuovo disponibile + Se noti che questo prodotto è di nuovo disponibile, segnalacelo e lavoreremo per verificarne le recensioni. - Segnala che il prodotto è disponibile + Segnala che il prodotto è disponibile - Verifica qualità recensioni + Verifica qualità recensioni - Verifica qualità recensioni + Verifica qualità recensioni + + Verifica qualità recensioni (%s) Questa operazione potrebbe richiedere circa 60 secondi. - Grazie per la segnalazione! + Grazie per la segnalazione! - Dovremmo avere informazioni su questo prodotto entro 24 ore. Ricontrolla più tardi. + Dovremmo avere informazioni su questo prodotto entro 24 ore. Ricontrolla più tardi. Impossibile verificare queste recensioni @@ -2359,17 +2313,17 @@ Ulteriori informazioni - Selezionando “Sì, provala” accetti l’%2$s e i %3$s di %1$s by Mozilla. + Selezionando “Sì, provala” accetti l’%2$s e i %3$s di %1$s by Mozilla. - Selezionando “Sì, provalo” accetti le condizioni di %1$s: + Selezionando “Sì, provalo” accetti le condizioni di %1$s: - informativa sulla privacy + informativa sulla privacy - Informativa sulla privacy + Informativa sulla privacy - condizioni di utilizzo del servizio + condizioni di utilizzo del servizio - Condizioni di utilizzo del servizio + Condizioni di utilizzo del servizio Sì, provala @@ -2405,6 +2359,9 @@ Competitività + + “%s” + comprimi @@ -2422,4 +2379,204 @@ aprire il link con ulteriori informazioni %s, intestazione + + + Link + + Link disponibili + + + + + + Tradurre questa pagina? + + Prova le traduzioni riservate di %1$s + + Per garantire la tua privacy, i testi da tradurre non lasciano mai il tuo dispositivo. Nuove lingue e altri miglioramenti presto disponibili. %1$s + + Ulteriori informazioni + + Traduci da + + Traduci in + + Non ora + + Fatto + + Traduci + + Riprova + + Traduzione + + Traduzione in corso + + + Si è verificato un problema durante la traduzione. Riprova. + + Impossibile caricare le lingue. Controlla la connessione a Internet e riprova. + + Siamo spiacenti, %1$s non è ancora supportato. + + Ulteriori informazioni + + + + Opzioni di traduzione + + Proponi sempre la traduzione + + Traduci sempre %1$s + + Non tradurre mai %1$s + + Non tradurre mai questo sito + + Impostazioni traduzione + + Informazioni sulle traduzioni in %1$s + + + + Traduzioni + + Proponi la traduzione quando possibile + + Scarica sempre le lingue in modalità Risparmio dati + + Opzioni traduzione + + Traduzione automatica + + Non tradurre mai questi siti + + Scarica lingue + + + + Traduzione automatica + + Seleziona una lingua per gestire le preferenze “Traduci sempre” e “Non tradurre mai“. + + + + Proponi la traduzione (predefinita) + + + %1$s proporrà la traduzione per i siti in questa lingua. + + Traduci sempre + + %1$s tradurrà automaticamente questa lingua al caricamento della pagina. + + Non tradurre mai + + %1$s non proporrà mai la traduzione per i siti in questa lingua. + + + + Non tradurre mai questi siti + + Per aggiungere un nuovo sito: visitalo e seleziona “Non tradurre mai questo sito” dal menu di traduzione. + + Rimuovi %1$s + + Rimuovere %1$s? + + Rimuovi + + Annulla + + + + Scarica lingue + + Scarica le lingue complete per tradurre più velocemente e senza bisogno di una connessione a Internet. %1$s + + Ulteriori informazioni + + Lingue disponibili + + obbligatoria + + %1$s (%2$s) + + Scarica lingue + + Tutte le lingue + + Rimuovi + + In corso + + Scarica + + Selezionata + + + Eliminare %1$s (%2$s)? + + Se elimini questa lingua, %1$s scaricherà parzialmente le lingue nella cache durante la traduzione. + + Eliminare tutte le lingue (%1$s)? + + Se elimini tutte le lingue, %1$s scaricherà parzialmente le lingue nella cache durante la traduzione. + + Elimina + + Annulla + + + Scaricare in modalità Risparmio dati (%1$s)? + + Scarichiamo lingue parziali nella tua cache per mantenere le traduzioni riservate. + + Scarica sempre in modalità Risparmio dati + + Scarica + + Scarica e traduci + + Annulla + + + + Strumenti di debug + + Torna indietro + + Strumenti per le schede + + Conteggio schede + + Attive + + Inattive + + Anonime + + Totale + + Strumento per la creazione di schede + + Numero di schede da creare + + Aggiungi a schede attive + + Aggiungi a schede inattive + + Aggiungi a schede anonime diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index a0856158a4cc..2b64746de814 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -69,11 +69,6 @@ לא להשאיר עקבות במכשיר זה - - ‏%1$s מוחק את העוגיות, ההיסטוריה ונתוני האתר שלך כאשר כל החלונות הפרטיים שלך נסגרים. %2$s חיפוש בדף + + תרגום הדף שמירה לאוסף @@ -329,21 +326,19 @@ לא כעת - - הגדרת Firefox כדפדפן ברירת המחדל שלך אנחנו אוהבים לשמור עליך + + הדפדפן שלנו שמגובה בקרן ללא מטרות רווח מסייע למנוע מחברות לעקוב אחריך בסתר ברחבי הרשת.\n\nמידע נוסף בהצהרת הפרטיות שלנו. + + הצהרת פרטיות הגדרה כדפדפן ברירת המחדל לא כעת - לקפוץ מהטלפון למחשב הנייד ובחזרה - להישאר מוצפן במעבר בין מכשירים - - ניתן לקבל לשוניות וססמאות מהמכשירים האחרים שלך כדי להמשיך מאיפה שהפסקת. כאשר החשבון שלך מחובר ומסונכרן, אתה מוגן יותר. Firefox מצפין את הססמאות והסימניות שלך ועוד. @@ -351,12 +346,12 @@ כניסה לא כעת - - התרעות עוזרות לך לעשות יותר עם Firefox התרעות עוזרות לך להישאר בטוח יותר עם Firefox + + לשלוח לשוניות בין המכשירים שלך בצורה מאובטחת ולהיחשף ליכולות פרטיות נוספות ב־Firefox. הפעלת התרעות @@ -395,8 +390,6 @@ יש לבחור אחד - ניהול קיצורי דרך לחיפוש - ניהול מנועי חיפוש חלופיים עריכת מנועים הגלויים בתפריט החיפוש @@ -410,8 +403,6 @@ מנועי חיפוש הצעות ממנועי חיפוש - - שורת כתובת העדפות שורת הכתובת @@ -444,11 +435,70 @@ מצב HTTPS בלבד + + צמצום כרזות עוגיות + + חוסם כרזות עוגיות + + חוסם כרזות עוגיות בגלישה פרטית + + צמצום כרזות עוגיות + + כבוי + + פעיל + + ‏%1$s מנסה לדחות בקשות עוגיות אוטומטית בכרזות עוגיות. כבוי עבור אתר זה + + ביטול + + שליחת בקשה + + לבקש תמיכה עבור אתר זה? + + הבקשה נשלחה פעיל עבור אתר זה + + נשלחה בקשת תמיכה + + האתר לא נתמך כרגע + + להפעיל צמצום כרזות עוגיות לאתר %1$s? + + להפעיל חוסם כרזות עוגיות לאתר %1$s? + + להשבית צמצום כרזות עוגיות לאתר %1$s? + + להשבית חוסם כרזות עוגיות לאתר %1$s? + + ל־%1$s אין אפשרות לדחות באופן אוטומטי בקשות עוגיות באתר הזה. אפשר לשלוח בקשה לתמוך באתר הזה בעתיד. + + ‏%1$s ינקה את העוגיות של אתר זה וירענן את הדף. ניקוי כל העוגית עשוי לנתק את החשבון שלך מהאתר או לרוקן את עגלת הקניות שלך. + + כיבוי אפשרות זו תגרום לכך ש־%1$s ינקה עוגיות ויטען מחדש את אתר זה. פעולה זו עשויה לנתק את החשבון שלך מהאתר או לרוקן את עגלת הקניות שלך. + + ‏%1$s מנסה לדחות באופן אוטומטי את כל בקשות העוגיות באתרים נתמכים. + + הפעלת אפשרות זו תגרום לכך ש־%1$s ינסה לסרב באופן אוטומטי לכל כרזות העוגיות באתר זה. + + לאפשר ל־%1$s לדחות כרזות עוגיות? + + ‏%1$s יכול לדחות באופן אוטומטי מגוון רחב של בקשות כרזות עוגיות. + + לא כעת + + תוצגנה פחות בקשות עוגיות + + לאפשר + + ‏%1$s הרגע סירב לעוגיות עבורך + + פחות הסחות דעת, פחות מעקב עם עוגיות באתר הזה. + מנסה להתחבר באופן אוטומטי לאתרים באמצעות פרוטוקול ההצפנה HTTPS לצורך אבטחה מוגברת. @@ -471,14 +521,10 @@ יחד עם זאת, ייתכן שיש גם גורם זדוני בתמונה. היה ובחרת להמשיך לאתר, אין להזין מידע רגיש. המשך לאתר יבטל באופן זמני את מצב HTTPS בלבד עבור האתר. נגישות - - שרת Firefox Account מותאם אישית שרת חשבוןו Mozilla מותאם אישית שרת Sync מותאם אישית - - שרת Firefox Account/Sync השתנה. היישום ייסגר לצורך להחלת השינויים… שרת חשבון Mozilla השתנה. היישום ייסגר לצורך להחלת השינויים… @@ -496,8 +542,6 @@ יש להתחבר כדי לסנכרן את הלשוניות, הסימניות הססמאות ועוד. - חשבון Firefox - חשבון Mozilla יש להתחבר מחדש כדי להמשיך בסנכרון @@ -509,8 +553,6 @@ איסוף נתונים ניפוי שגיאות מרחוק דרך USB - - הצגת מנועי חיפוש הצגת הצעות חיפוש @@ -625,6 +667,14 @@ ‏%s קלאסי + + סדרת האומנים + + אוסף הקולות העצמאיים. %s + + אוסף הקולות העצמאיים. + + אולי איזה מגע של צבע אפשר לבחור טפט שהולם אותך. @@ -639,12 +689,6 @@ סיור בתוספות - - - התוספת אינה נתמכת - - התוספת כבר מותקנת - התוספות מושבתות באופן זמני @@ -1283,6 +1327,10 @@ סגירת לשוניות פרטיות + + לסגור את הלשוניות הפרטיות? + יש להקיש או להחליק על התרעה זו כדי לסגור את הלשוניות הפרטיות. + שיווק @@ -1521,6 +1569,8 @@ כל העוגיות (ישבש פעילות של אתרים) בידוד עוגיות חוצות אתרים + + להורות לאתרים לא לשתף או למכור את הנתונים שלי תוכן מעקב @@ -1859,28 +1909,18 @@ הוספת מנוע חיפוש חדש עריכת מנוע חיפוש - - הוספה - - שמירה עריכה מחיקה - - אחר שם - - שם שם מנוע החיפוש כתובת מחרוזת החיפוש - מחרוזת חיפוש לשימוש - כתובת URL לשימוש לחיפוש יש להחליף את השאילתה עם ״%s״. לדוגמה:\nhttps://www.google.com/search?q=%s @@ -1995,6 +2035,8 @@ נא לחבר מכשיר נוסף. + + נא לאמת מחדש. נא להפעיל סנכרון לשוניות. @@ -2110,8 +2152,6 @@ - בודק הסקירות - בודק הסקירות סקירות אמינות @@ -2124,7 +2164,9 @@ דירוג מותאם - סקירות בלתי אמינות הוסרו + סקירות בלתי אמינות הוסרו + + מבוסס על סקירות אמינות דגשים מהסקירות האחרונות @@ -2135,14 +2177,10 @@ ציון אות מ־A עד F.]]> סקירות אמינות. אנו מאמינים שהסקירות הן ככל הנראה מלקוחות אמיתיים שהשאירו סקירות כנות ושאינן משוחדות. - - אנו מאמינים שסקירות אלו אמינות. אנו מאמינים שיש שילוב של סקירות אמינות ובלתי אמינות. סקירות בלתי אמינות. אנו מאמינים שהסקירות כנראה מזויפות או של סוקרים מוטים או משוחדים. - - אנו מאמינים שסקירות אלו אינן אמינות. הדירוג המותאם מבוסס רק על סקירות שאנו מאמינים שהן אמינות.]]> @@ -2158,8 +2196,6 @@ הצגת פרסומות בבודק הסקירות - מדי פעם יוצגו פרסומות עבור מוצרים רלוונטיים. כל הפרסומות חייבות לעמוד בתקני איכות הסקירות שלנו. %s - מדי פעם יוצגו פרסומות עבור מוצרים רלוונטיים. אנו מפרסמים רק מוצרים עם סקירות אמינות. %s מידע נוסף @@ -2181,24 +2217,24 @@ כאשר למוצר זה יהיו סקירות נוספות, נוכל לבדוק את האיכות שלהן. - המוצר אינו זמין + המוצר אינו זמין - אם מוצר זה חזר למלאי, נא לדווח על כך ואנו נעבוד על בדיקת הסקירות. - - שליחת דיווח שמוצר זה חזר למלאי + אם מוצר זה חזר למלאי, נא לדווח על כך ואנו נעבוד על בדיקת הסקירות. - שליחת דיווח שמוצר זה חזר למלאי + שליחת דיווח שמוצר זה חזר למלאי - בתהליך בדיקת איכות הסקירות + בתהליך בדיקת איכות הסקירות - בתהליך בדיקת איכות הסקירות + בתהליך בדיקת איכות הסקירות + + בתהליך בדיקת איכות הסקירות (%s) פעולה זו יכולה להימשך כ־60 שניות. - תודה על הדיווח! + תודה על הדיווח! - אמור להיות לנו מידע על הסקירות של מוצר זה תוך 24 שעות. נא לבדוק שוב אז. + אמור להיות לנו מידע על הסקירות של מוצר זה תוך 24 שעות. נא לבדוק שוב אז. אין באפשרותנו לבדוק סקירות אלה @@ -2237,17 +2273,17 @@ מידע נוסף - בחירה באפשרות ״כן, ארצה לנסות״ מהווה הסכמה ל%2$s ול%3$s של %1$s מאת Mozilla. + בחירה באפשרות ״כן, ארצה לנסות״ מהווה הסכמה ל%2$s ול%3$s של %1$s מאת Mozilla. - בחירה באפשרות ״כן, ארצה לנסות״ מהווה הסכמה לתנאים הבאים מאת %1$s: + בחירה באפשרות ״כן, ארצה לנסות״ מהווה הסכמה לתנאים הבאים מאת %1$s: - הצהרת הפרטיות + הצהרת הפרטיות - מדיניות הפרטיות + מדיניות הפרטיות - תנאי השימוש + תנאי השימוש - תנאי שימוש + תנאי שימוש כן, ארצה לנסות @@ -2283,6 +2319,9 @@ תחרותיות + + ״%s״ + לכווץ @@ -2300,4 +2339,204 @@ לפתוח את הקישור לקבלת מידע נוסף %s, כותרת + + + קישורים + + קישורים זמינים + + + + + + לתרגם את הדף הזה? + + לנסות תרגומים פרטיים ב־%1$s + + למען הפרטיות שלך, תרגומים לעולם אינם עוזבים את המכשיר שלך. שפות חדשות ושיפורים בקרוב! %1$s + + מידע נוסף + + שפת מקור + + שפת יעד + + לא כעת + + סיום + + תרגום + + ניסיון חוזר + + בתהליך תרגום + + התרגום בתהליך + + + אירעה שגיאה בתרגום. נא לנסות שוב. + + לא ניתן היה לטעון שפות. נא לבדוק את חיבור האינטרנט שלך ולנסות שוב. + + איננו תומכים ב%1$s עדיין, עמך הסליחה. + + מידע נוסף + + + + אפשרויות תרגום + + תמיד להציע לתרגם + + תמיד לתרגם מ%1$s + + לעולם לא לתרגם מ%1$s + + לעולם לא לתרגם את אתר זה + + הגדרות תרגום + + על אודות תרגומים ב־%1$s + + + + תרגומים + + להציע לתרגם כשהדבר אפשרי + + תמיד להוריד שפות במצב חיסכון בנתונים + + העדפות תרגום + + תרגום אוטומטי + + לעולם לא לתרגם אתרים אלו + + הורדת שפות + + + + תרגום אוטומטי + + יש לבחור שפה כדי לנהל את ההעדפות של ״תמיד לתרגם״ ו״לעולם לא לתרגם״. + + + + להציע לתרגם (ברירת מחדלץ) + + ‏%1$s יציע לתרגם אתרים בשפה זו. + + תמיד לתרגם + + ‏%1$s יתרגם שפה זו באופן אוטומטי כאשר הדף נטען. + + לעולם לא לתרגם + + ‏%1$s לעולם לא יציע לתרגם אתרים בשפה זו. + + + + לעולם לא לתרגם אתרים אלו + + כדי להוסיף אתר חדש, יש לבקר בו ולבחור באפשרות ״לעולם לא לתרגם אתר זה״ מתפריט התרגום. + + להסיר את %1$s + + למחוק את %1$s? + + מחיקה + + ביטול + + + + הורדת שפות + + ניתן להוריד שפות שלמות לתרגום מהיר יותר ולתרגום לא מקוון. %1$s + + מידע נוסף + + שפות זמינות + + נדרש + + %1$s (%2$s) + + הורדת שפות + + כל השפות + + מחיקה + + בתהליך + + הורדה + + נבחר + + + למחוק את %1$s (%2$s)? + + אם שפה זו תימחק, %1$s יוריד שפות חלקיות למטמון שלך תוך כדי תרגום. + + למחוק את כל השפות (%1$s)? + + אם כל השפות יימחקו, %1$s יוריד שפות חלקיות למטמון שלך תוך כדי תרגום. + + מחיקה + + ביטול + + + להוריד במצב חיסכון בנתונים (%1$s)? + + + אנו מורידים שפות חלקיות למטמון שלך כדי לשמור על פרטיות התרגומים. + + תמיד להוריד במצב חיסכון בנתונים + + הורדה + + הורדה ותרגום + + ביטול + + + + כלים לניפוי שגיאות + + ניווט אחורה + + כלי לשוניות + + ספירת לשוניות + + פעיל + + לא פעיל + + פרטי + + סה״כ + + כלי ליצירת לשוניות + + כמות הלשוניות ליצירה + + הוספה ללשוניות פעילות + + הוספה ללשוניות לא פעילות + + הוספה ללשוניות פרטיות diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 635cd6314257..79bbd76de272 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -72,11 +72,6 @@ この端末を追跡させません - - すべてのプライベートウィンドウを閉じると、%1$s により Cookie、履歴、サイトデータが削除されます。%2$s ページ内検索 + + ページを翻訳 コレクションに保存 @@ -336,14 +333,8 @@ 後で - - Firefox をいつものブラウザーに 私たちはあなたの安全を守りたいと願っています - - Firefox はユーザーのことを第一に考え、クロスサイトトラッカーからあなたのプライバシーを守ります。\n\n詳細はプライバシー通知をご覧ください。 非営利で作られた私たちのブラウザーは、企業によるウェブ上の密かな追跡を阻止するのに役立ちます。\n\n詳細はプライバシー通知をご覧ください。 後で - - スマートフォンとラップトップの間を行ったり来たり 端末間の移動時に暗号化した状態を維持します - - 他の端末からタブとパスワードを転送して、中断したところから再開できます。 ログインして同期すると、Firefox がユーザーのパスワードやブックマークなどを暗号化して、より安全に使用できます。 @@ -367,15 +354,9 @@ ログイン 後で - - 通知をオンにして Firefox をさらに活用しましょう 通知をオンにして Firefox で安全性を高めましょう - - 通知を使って他の端末にタブを送信したり、ダウンロードを管理したり、Firefox を最大限に活用するためのヒントを受け取れます。 端末間で安全にタブを送信するなど、Firefox の他のプライバシー機能を見つけましょう。 @@ -419,8 +400,6 @@ 一つを選んでください - 検索ショートカットの管理 - 代替検索エンジンを管理 検索メニューに表示されるエンジンの編集 @@ -434,8 +413,6 @@ 検索エンジン 検索エンジンからの検索候補 - - アドレスバー アドレスバーの設定 @@ -560,14 +537,10 @@ ただし、攻撃者が関与している可能性もあります。ウェブサイトにアクセスする場合は機密情報を入力しないでください。続行すると、サイトの HTTPS-Only モードが一時的にオフになります。 アクセシビリティ - - カスタム Firefox アカウントサーバー カスタム Mozilla アカウントサーバー カスタム Sync サーバー - - Firefox アカウント/Sync サーバーが変更されました。変更を適用するためにアプリケーションを終了しています… Mozilla アカウント/Sync サーバーが変更されました。変更を適用するためにアプリケーションを終了しています… @@ -585,8 +558,6 @@ ログインしてタブやブックマーク、パスワードなどを同期しましょう。 - Firefox アカウント - Mozilla アカウント 再接続して同期を再開 @@ -598,8 +569,6 @@ データ収集 USB 経由でリモートデバッグする - - 検索エンジンを表示する 検索語句の候補を表示する @@ -731,12 +700,6 @@ アドオンを探す - - - サポートされていないアドオンです - - アドオンはすでにインストールされています。 - アドオンは一時的に無効化されています @@ -1382,6 +1345,11 @@ プライベートタブを閉じる + + + プライベートタブを閉じますか? + プライベートタブを閉じるには、この通知をタップまたはスワイプしてください。 + マーケティング @@ -1622,6 +1590,8 @@ すべての Cookie (ウェブサイトが動作しない原因になります) クロスサイト Cookie を分離する + + ウェブサイトにユーザーデータの共有と販売の拒否を通知する トラッキングコンテンツ @@ -1965,28 +1935,18 @@ 新しい検索エンジンを追加します 検索エンジンの編集 - - 追加 - - 保存 編集 削除 - - その他 名前 - - 検索エンジン名 検索エンジン名 検索文字列の URL - 検索クエリー文字列 - 検索に使用する URL クエリーを “%s” に置き換えます。例:\nhttps://www.google.com/search?q=%s @@ -2217,8 +2177,6 @@ - レビューチェッカー - レビューチェッカー 信頼できるレビュー @@ -2232,7 +2190,9 @@ レートが調整されています - 信頼できないレビューを削除しました + 信頼できないレビューを削除しました + + 信頼できないレビューに基づきます 最近の注目レビュー @@ -2243,14 +2203,10 @@ レターグレード で評価します。]]> 信頼できるレビューです。これは正直で偏見を持たない本物の顧客によるレビューであると思われます。 - - 信頼できるレビューと思われます。 信頼できるレビューと信頼できないレビューが混在していると思われます。 信頼できないレビューです。これは偽物または偏見を持ったレビュアーによるレビューであると思われます。 - - 信頼できないレビューです。 調整されたレート は私たちが信頼するに足ると評価したレビューのみを基にしています。]]> @@ -2266,8 +2222,6 @@ レビューチェッカーに広告を表示する - 時々、関連製品の広告が表示されます。すべての広告は私たちのレビュー品質基準を満たしています。%s - 時々、関連製品の広告が表示されます。私たちはレビュー品質基準を満たした信頼できる製品のみを広告しています。%s 詳細情報 @@ -2290,24 +2244,24 @@ この製品の品質を確認可能な数のレビューが掲載されるまでお待ちください。 - 製品が利用できません + 製品が利用できません - この製品が再入荷されている場合はご報告ください。その製品レビューを確認します。 - - 製品が再入荷されたことを報告する + この製品が再入荷されている場合はご報告ください。その製品レビューを確認します。 - 製品の在庫があることを報告する + 製品の在庫があることを報告する - レビューの品質の確認 + レビューの品質の確認 - レビューの品質の確認 + レビューの品質の確認 + + レビューの品質の確認 (%s) これには約 60 秒かかります。 - ご報告ありがとうございます。 + ご報告ありがとうございます。 - この製品のレビュー情報は 24 時間以内に更新されます。後でもう一度確認してください。 + この製品のレビュー情報は 24 時間以内に更新されます。後でもう一度確認してください。 これらのレビューは確認できません @@ -2347,17 +2301,17 @@ 詳細情報 - 「はい、試します」を選択すると、%1$s by Mozilla の%2$s および %3$s に同意したものとみなされます。 + 「はい、試します」を選択すると、%1$s by Mozilla の%2$s および %3$s に同意したものとみなされます。 - 「はい、試します」を選択すると、%1$s の以下の内容に同意したものとみなされます: + 「はい、試します」を選択すると、%1$s の以下の内容に同意したものとみなされます: - プライバシーポリシー + プライバシーポリシー - プライバシーポリシー + プライバシーポリシー - 利用規約 + 利用規約 - 利用規約 + 利用規約 はい、試します @@ -2394,6 +2348,9 @@ 競争力 + + “%s” + 折りたたむ @@ -2411,4 +2368,203 @@ リンクを開いて詳細を表示 %s、見出し + + リンク + + 利用可能なリンク + + + + + + このページを翻訳しますか? + + %1$s でプライベート翻訳を試してください + + プライバシーを重視し、翻訳データは端末内のみで処理されます。対応言語の追加と改善に乞うご期待! %1$s + + 詳細情報 + + 翻訳元 + + 翻訳先 + + 後で + + 完了 + + 翻訳 + + 再試行 + + 翻訳中 + + 翻訳中です + + 翻訳時に問題が発生しました。もう一度試してください。 + + 言語を読み込めませんでした。インターネット接続を確認して、もう一度試してください。 + + 申し訳ありませんが、%1$s はまだサポートされていません。 + + 詳細情報 + + + + 翻訳オプション + + 常に翻訳機能を提供する + + %1$s のページを常に翻訳する + + %1$s のページは翻訳しない + + このサイトは翻訳しない + + 翻訳設定 + + %1$s の翻訳機能について + + + + 翻訳 + + + 翻訳可能な場合に通知する + + 常にデータ節約モードで言語をダウンロードする + + 翻訳の設定 + + 自動翻訳 + + これらのサイトは翻訳しない + + 言語をダウンロード + + + + 自動翻訳 + + 設定で「常に翻訳する」言語と「翻訳しない」言語を選択します。 + + + + 翻訳を通知する (既定) + + %1$s がサイトをこの言語に翻訳可能であることを通知します。 + + 常に翻訳する + + %1$s がこの言語のページの読み込み時に自動的に翻訳します。 + + 翻訳しない + + %1$s はサイトをこの言語に翻訳可能であることを通知しません。 + + + + これらのサイトは翻訳しない + + 新しいサイトを追加するには: そのサイトにアクセスし、翻訳メニューから「このサイトを翻訳しない」を選択します。 + + %1$s を削除します + + %1$s を削除しますか? + + 削除 + + キャンセル + + + + 言語をダウンロード + + + 言語をすべてダウンロードして、翻訳を高速化したり、オフラインで翻訳したりできます。 %1$s + + 詳細情報 + + 利用可能な言語 + + 必須 + + %1$s (%2$s) + + 言語をダウンロード + + すべての言語 + + 削除 + + ダウンロード中 + + ダウンロード + + 選択済み + + + %1$s (%2$s) を削除しますか? + + この言語を削除すると、翻訳時に %1$s が言語の一部をキャッシュにダウンロードします。 + + すべての言語 (%1$s) を削除しますか? + + すべての言語を削除すると、翻訳時に %1$s が言語の一部をキャッシュにダウンロードします。 + + 削除 + + キャンセル + + + データ節約モード中にダウンロード (%1$s) しますか? + + 翻訳のプライバシー保つため、言語の一部をキャッシュにダウンロードします。 + + 常にデータ節約モードでダウンロードする + + ダウンロード + + ダウンロードして翻訳 + + キャンセル + + + + デバッグツール + + 前のページへ戻ります + + タブツール + + タブ数 + + 使用中 + + 未使用 + + プライベート + + 合計 + + タブ作成ツール + + 作成するタブの数 + + 使用中のタブに追加 + + 未使用のタブに追加 + + プライベートタブに追加 diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 1fa6c7bafb11..c3a84bcb12ed 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -73,12 +73,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ur ttaǧǧa ara akk later ɣef yibenk-a - - %1$s itekkes inagan n tuqqna, azray, akked yisefka n yismal web mi ara tmedleḍ akk isfuyla usligen. %2$s - - - Seqdec Firefox d iminig-inek amezwer Nḥemmel ad teqqimeḍ d aɣellsan - - Firefox izewwir deg yimdanen uqbel idrimen, yekkat ɣef tudert-ik tabaḍnit s usewḥel n yineḍfaren n gar yismal.\n\Issin ugar deg Tasertit-nneɣ tbaḍnit. Iminig-nneɣ tettallit yiwet n tkebbanit ur nettnadi ɣef tedrimt, tessewḥal tikebbaniyin ara ak-iḍefren deg web.\n\nIssin ugar ɣef tsertit-nneɣ n tbaḍnit. Mačči tura - Ɛeddi seg tiliɣri ɣer uselkim, neɣ seg uselkim ɣer tiliɣri - Mmesten iman-ik s ttawil n uwgelhen mi ara tɛeddiḍ seg yibenk ɣer wayeḍ - - Err-d accaren d wawalen uffiren seg yibenkan-ik·im-nniḍen i wakken ad tkemmleḍ segwanda i tḥebseḍ. Mi ara teqqneḍ rnu ad tremdeḍ amtawi, taɣellist tettwaseǧhed. Firefox yettwgelhin awalen-ik uffiren, ticraḍ n yisebtar, akked wayen niḍen. @@ -367,15 +351,9 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Kcem Mačči tura - - Ilɣa ttɛawanen ad tgeḍ ugar akked Firefox Ilɣa ad ak-ɛawnen ad teqqimeḍ d aɣellsan s Firefox - - Azen accaren gar ibenkan, sefrek isadaren, rnu awi iwellihen akken ara tfaṛseḍ ugar seg Firefox. Azen s wudem aɣellsan accaren seg yibenk ɣer wayeḍ, tesnirmeḍ timahilin timaynutin n ummesten n tudert tabaḍnit deg Firefox. @@ -413,8 +391,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ɣef Fren yiwen - - Sefrek inegzumen n unadi Ffer imseddayen i d-ibanen deg wumuɣ n unadi @@ -427,8 +403,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Nadi imseddayen n unadi Isumar seg yimseddayen n unadi - - Afeggag n tansa Ismenyifen i ufeggag n tansiwin @@ -466,6 +440,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Asenqes n yiɣarracen n yinagan n tuqqna Amsewḥel n yiɣarracen n yinagan n tuqqna + + Amsewḥal n uɣerrac n yinagan n tuqqna deg tunigin tusligt Senqes iɣarracen n yinagan n tuqqna @@ -505,6 +481,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara %1$s ad isfeḍ inagan n tuqqna n usmel-a syen ad issesfer asebter. Asfaḍ meṛṛa n yinagan n tuqqna yezmer ad ak·am-isseḥbes tuqqna neɣ ad yenɣel tiqecwalin n tiɣtin. + + Sens ma d %1$s ad yesfeḍ inagan n tuqqna sakin ad yales asali n usmel-a. Atagi ad ak-isuffeɣ neɣ ad isilem tikarḍiwin-ik n tiɣin. %1$s yettaɛraḍ s wudem awurman ad yagi issutar n yinagan n tuqqna deg yismal i ten-yessefraken. @@ -544,14 +522,10 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Yezmer daɣen ad tili d aẓḍam. Ma yella tkemmleḍ ɣer usmel-a web, ur ilaq ara akk ad taruḍ agbur amḥulfu. Ma yella tkemmleḍ, f askar HTTPS kan ara yensen i kra n wakud i usmel-a. Tuffart - - Sagen aqeddac n umiḍan Firefox Sagen aqeddac n umiḍan Mozilla Sagen aeddac n umtawi - - Amiḍan Firefox/Aqeddac n umtawi ittwasnifel, Ffeɣ seg usnas akken ad iddu usnifel… Aqeddac i umtawi neɣ amiḍan n Mozilla yettwasenfel, Ffeɣ seg usnas akken ad iddu usnifel… @@ -569,8 +543,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Qqen ɣer waccaren yemtawan, ticraḍ n yisebtar, awalen uffiren d wugar n wayen-nniḍen. - Amiḍan Firefox - Amiḍan n Mozilla Ales tuqqna akken ad ikemmel umtawi @@ -582,8 +554,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Alqaḍ n yisefka Taseɣtayt tanmeggagt s USB - - Sken-d imseddayen n unadi Sken isumar n unadi @@ -716,12 +686,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Snirem izegrar - - - Azegrir ur yettusefrak ara - - Azegrir yettusebded yakan - Azegrir yensa i kra n wakud @@ -1944,28 +1908,18 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Rnu amsedday n unadi amaynut Ẓreg amsedday n unadi - - Rnu - - Sekles Ẓreg Kkes - - Wiyaḍ Isem - - Isem Isem n umsedday n unadi URL n uzrir n unadi - Aḍris ara tnadiḍ - URL yettwaseqdac i unadi Beddel aḍris n unadi “%s”. Amedya: \nhttps://www.google.com/search?q=%s @@ -2199,8 +2153,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara - Amsenqad n tamawt - Amsenqad n tamawt Ilɣa inaflasen @@ -2213,13 +2165,11 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Aktazal yettwaseɣta - Yir alɣu yettwakkes + Yir alɣu yettwakkes Tamuɣli s wazal-is seg yilɣa imaynuten Amek ara nettguccul alɣu n tɣara - - Nettwali iwellihen-a ttwamanent. Nettwali iwellihen sdukklen iwellihen inaflasen d yiwellihen arinaflasen. @@ -2247,19 +2197,17 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ulac ddeqs n tamiwin akka tura - Afaris ulac-it - - Mmel tuɣalin n ufaris deg tawsa + Afaris ulac-it - Mmel tuɣalin n ufaris deg tawsa + Mmel tuɣalin n ufaris deg tawsa - Adenqed n tɣara n yilɣa + Adenqed n tɣara n yilɣa - Adenqed n tɣara n yilɣa + Adenqed n tɣara n yilɣa Aya yezmer ad yeṭṭef 60 tsinin. - Tanemmirt ɣef tuzna n uneqqis! + Tanemmirt ɣef tuzna n uneqqis! Ur nezmir ara ad nsenqed tamawin-a @@ -2324,6 +2272,9 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Amḥizwer + + “%s” + fneẓ @@ -2339,4 +2290,85 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara ɣer amagrad ldi aseɣwen i wakken ad tissineḍ ugar + + + + + + Suqqel asebter-a? + + Issin ugar + + Suqqel seg + + Suqqel ɣer + + Mačči tura + + Suqel + + Suqqel + + + Sumer yal tikkelt tasuqqilt + + Werǧin asuqel n usmel-a + + + + Tisuqilin + + Ismenyifen n tsuqilt + + + Kkes %1$s + + Kkes %1$s? + + Kkes + + Sefsex + + + + Sader tutlayin + + Issin ugar + + Tutlayin yellan + + iţusra + + Sader tutlayin + + Meṛṛa tutlayin + + Kkes + + Iteddu + + Sader + + Yettwafran + + + Kkes + + Sefsex + + + Sader + + Sefsex + + + Urmid + + Insa + + Tabaḍnit + + Asemday diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index 90113286c912..2e6190648f2d 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -67,11 +67,6 @@ Бұл құрылғыда із қалдырмау - - Барлық жеке терезелерді жапқанда, %1$s cookie файлдарын, тарихты және сайт деректерін өшіреді. %2$s Беттен табу + + Парақты аудару Жинаққа сақтау @@ -328,14 +325,8 @@ Қазір емес - - Firefox-ты негізгі браузер етіп орнатыңыз Біз сіздің қауіпсіздігіңізді қамтамасыз етуді жақсы көреміз - - Firefox сайтаралық трекерлерді блоктау арқылы адамдарды табыстан жоғары қояды және жекелігіңізді қорғайды.\n\nТолығырақ ақпаратты жекелік хабарламамыздан алыңыз. Коммерциялық емес ұйымы қолдау көрсететін браузеріміз компаниялардың сізді интернетте жасырын бақылап отыруын тоқтатуға көмектеседі.\n\nЖекелік ескертуімізден толығырақ ақпарат алыңыз. Қазір емес - Телефоннан ноутбукке және кері өтіңіз - Құрылғылар арасында өткенде шифрленген күйде қала беріңіз - - Тоқтаған жерден жалғастыру үшін басқа құрылғыларыңыздан беттер мен парольдерді алыңыз. Жүйеге кіріп, синхрондалған кезде қауіпсіз боласыз. Firefox сіздің парольдерді, бетбелгілерді және т.б. шифрлейді. @@ -358,15 +345,9 @@ Кіру Қазір емес - - Хабарландырулар Firefox арқылы көбірек жұмыс бітіруге көмектеседі Хабарландырулар Firefox көмегімен қауіпсіз болып қалуға көмектеседі - - Құрылғылар арасында беттерді жіберіңіз, жүктемелеріңізді басқарыңыз және Firefox мүмкіндігін барынша пайдалану туралы кеңестер алыңыз. Құрылғылар арасында беттерді қауіпсіз жіберіңіз және Firefox қолданбасының басқа жекелік мүмкіндіктерін өзіңіз үшін ашыңыз. @@ -408,8 +389,6 @@ Біреуін таңдаңыз - Іздеу жарлықтарын басқару - Балама іздеу жүйелерін басқару Іздеу мәзірінде көрінетін іздеу жүйелерін түзету @@ -424,8 +403,6 @@ Іздеу жүйелері Іздеу жүйелерінен ұсыныстар - - Адрес жолағы Адрес жолағының баптаулары @@ -550,14 +527,10 @@ Дегенмен, шабуылдаушы араласқан болуы да мүмкін. Веб-сайтқа өтуді жалғастырсаңыз, ешқандай құпия ақпаратты енгізбеуіңіз керек. Жалғастырсаңыз, сайт үшін тек-HTTPS режимі уақытша сөндіріледі. Қолжетерлілік - - Таңдауыңызша Firefox тіркелгісі сервері Таңдауыңызша Mozilla тіркелгі сервері Таңдауыңызша синхрондау сервері - - Firefox тіркелгісі/синхрондау сервері өзгертілген. Өзгерістерді іске асыру үшін қолданба жұмысын аяқтау… Mozilla тіркелгісі/синхрондау сервері өзгертілген. Өзгерістерді іске асыру үшін қолданба жұмысын аяқтау… @@ -575,8 +548,6 @@ Беттер, бетбелгілер, парольдерді синхрондау және т.б. үшін кіріңіз. - Firefox тіркелгісі - Mozilla тіркелгісі Синхрондауды жалғастыру үшін қайта байланысыңыз @@ -588,8 +559,6 @@ Деректер жинау USB арқылы қашықтан жөндеу - - Іздеу жүйелерін көрсету Іздеу ұсыныстарын көрсету @@ -719,12 +688,6 @@ Қосымшаларды шолу - - - Қосымшаға қолдау жоқ - - Қосымша орнатылған болып тұр - Қосымшалар уақытша сөндірілген @@ -1357,6 +1320,11 @@ Жекелік беттерді жабу + + + Жекелік беттерді жабу керек пе? + Жекелік беттерді жабу үшін бұл хабарландыруды шертіңіз немесе үстінен өткізіңіз. + Маркетинг @@ -1597,6 +1565,8 @@ Барлық cookies файлдары (веб-сайттар жұмысы бұзылады) Сайтаралық cookie файлдарын оқшаулау + + Веб-сайттарға деректермен бөліспеуді және оларды сатпауды айту Бақылайтын құрама @@ -1936,28 +1906,18 @@ Жаңа іздеу жүйесін қосу Іздеу жүйесін түзету - - Қосу - - Сақтау Түзету Өшіру - - Басқа Аты - - Атауы Іздеу жүйесінің атауы Іздеу жолының URL адресі - Қолданылатын іздеу жолы - Іздеу үшін пайдаланылатын URL Сұранымды "%s" жолымен алмастырыңыз. Мысалы:\nhttps://www.google.com/search?q=%s @@ -2186,8 +2146,6 @@ - Пікірлерді тексеру құралы - Пікірлерді тексеру Сенімді пікірлер @@ -2200,7 +2158,9 @@ Түзетілген рейтинг - Сенімсіз пікірлер өшірілді + Сенімсіз пікірлер өшірілді + + Сенімді пікірлерге негізделген Соңғы пікірлердің маңызды сәттері @@ -2211,14 +2171,10 @@ әріптік баға береміз.]]> Сенімді пікірлер. Бұл пікірлерді шын, бейтарап пікірлер қалдырған шынайы тұтынушылар жазған деп санаймыз. - - Пікірлер сенімді деп есептейміз. Осында сенімді және сенімсіз пікірлер араласқан деп санаймыз. Сенімсіз пікірлер. Бұл пікірлер жалған немесе біржақты шолушылар қалдырды деп санаймыз. - - Пікірлер сенімсіз деп есептейміз. Түзетілген рейтинг тек біз сенімді деп есептейтін пікірлерге негізделген.]]> @@ -2234,8 +2190,6 @@ Пікірлерді тексеру құралында жарнаманы көрсету - Сәйкес өнімдерге арналған жарнамаларды анда-санда көретін боласыз. Барлық жарнамалар біздің пікір сапа стандарттарына сай болуы керек. %s - Сәйкес өнімдерге арналған кездейсоқ жарнамаларды көресіз. Біз тек сенімді пікірлері бар өнімдерді жарнамалаймыз. %s Көбірек білу @@ -2258,23 +2212,23 @@ Бұл өнімде көбірек пікірлер болған кезде, біз олардың сапасын тексере аламыз. - Өнім қолжетімді емес + Өнім қолжетімді емес - Бұл өнімнің қоймаға қайта оралғанын көрсеңіз, оны бізге хабарлаңыз, біз пікірлерді тексереміз. + Бұл өнімнің қоймаға қайта оралғанын көрсеңіз, оны бізге хабарлаңыз, біз пікірлерді тексереміз. - Бұл өнімнің қоймаға оралғанын хабарлау - - Өнімнің қоймада бар болғанын хабарлау + Өнімнің қоймада бар болғанын хабарлау - Пікір сапасын тексеру + Пікір сапасын тексеру - Пікір сапасын тексеру + Пікір сапасын тексеру + + Пікір сапасын тексеру (%s) Бұл шамамен 60 секундқа созылуы мүмкін. - Хабарламаңыз үшін рахмет! + Хабарламаңыз үшін рахмет! - Бізде осы өнімнің пікірлері туралы ақпарат 24 сағат ішінде болуы керек. Кейінірек қайта тексеріңіз. + Бізде осы өнімнің пікірлері туралы ақпарат 24 сағат ішінде болуы керек. Кейінірек қайта тексеріңіз. Біз бұл пікірлерді тексере алмаймыз @@ -2312,17 +2266,17 @@ Көбірек білу - "Иә, қолданып көру" опциясын таңдау арқылы сіз Mozilla ұсынған %1$s қолданбасының %2$s және %3$s шарттарымен келісесіз. + "Иә, қолданып көру" опциясын таңдау арқылы сіз Mozilla ұсынған %1$s қолданбасының %2$s және %3$s шарттарымен келісесіз. - "Иә, қолданып көру" опциясын таңдау арқылы сіз %1$s ұсынған келесімен келісесіз: + "Иә, қолданып көру" опциясын таңдау арқылы сіз %1$s ұсынған келесімен келісесіз: - жекелік саясаты + жекелік саясаты - Жекелік саясаты + Жекелік саясаты - қолдану шарттары + қолдану шарттары - Қолдану шарттары + Қолдану шарттары Иә, қолданып көру @@ -2360,6 +2314,9 @@ Бәсекеге қабілеттілік + + "%s" + бүктеу @@ -2377,4 +2334,207 @@ көбірек білу үшін сілтемені ашыңыз %s, Тақырыптама + + + Сiлтемелер + + Сілтемелер қолжетімді + + + + + + Бұл парақты аудару керек пе? + + %1$s ішіндегі жекелік аудармаларды қолданып көріңіз + + Жекелігіңіз үшін аудармалар құрылғыңыздан ешқашан кетпейді. Жаңа тілдер мен жақсартулар жақында! %1$s + + Көбірек білу + + Бастапқы тіл: + + + Мақсат тілі: + + Қазір емес + + Дайын + + Аудару + + Қайтадан көру + + Аударуда + + Аудару орындалуда + + + Аудару кезінде мәселе орын алды. Қайталап көріңіз. + + Тілдер жүктелмеді. Интернет байланысын тексеріп, әрекетті қайталаңыз. + + Кешіріңіз, біз әлі %1$s қолдамаймыз. + + Көбірек білу + + + + Аударма баптаулары + + Аударуды әрқашан ұсыну + + %1$s әрқашан аудару + + %1$s ешқашан аудармау + + Бұл сайтты ешқашан аудармау + + Аударма баптаулары + + + %1$s ішіндегі аудармалар туралы + + + + Аудармалар + + Мүмкін болған кезде аударуды ұсыну + + Деректерді үнемдеу режимінде тілдерді әрқашан жүктеп алу + + Аударма баптаулары + + Автоматты аударма + + Бұл сайттарды ешқашан аудармау + + Тілдерді жүктеп алу + + + + Автоматты аударма + + "әрқашан аудару" және "ешқашан аудармау" баптауларды басқару үшін тілді таңдаңыз. + + + + Аударуды ұсыну (үнсіз келісім бойынша) + + %1$s осы тілдегі сайттарды аударуды ұсынады. + + Әрқашан аудару + + %1$s парақ жүктелген кезде бұл тілді автоматты түрде аударатын болады. + + Ешқашан аудармау + + + %1$s осы тілдегі сайттарды аударуды ешқашан ұсынбайды. + + + + Бұл сайттарды ешқашан аудармау + + Жаңа сайтты қосу үшін: Оны шолып, аударма мәзірінен "Бұл сайтты ешқашан аудармау" таңдаңыз. + + %1$s өшіру + + %1$s өшіру керек пе? + + Өшіру + + Бас тарту + + + + Тілдерді жүктеп алу + + Жылдам аудармалар және желіден тыс аудару үшін толық тілдерді жүктеп алыңыз. %1$s + + Көбірек білу + + Қолжетімді тілдер + + керек + + %1$s (%2$s) + + Тілдерді жүктеп алу + + Барлық тілдер + + Өшіру + + Орындалуда + + Жүктеп алу + + Таңдалған + + + %1$s өшіру керек пе (%2$s)? + + + Бұл тілді өшірсеңіз, аударған кезде %1$s тілдерді кэшіңізге жартылай жүктеп алады. + + Барлық тілдерді өшіру керек пе (%1$s)? + + Барлық тілдерді өшірсеңіз, аударған кезде %1$s тілдерді кэшіңізге жартылай жүктеп алады. + + Өшіру + + Бас тарту + + + Деректерді үнемдеу режимінде (%1$s) жүктеп алу керек пе? + + Аудармаларды құпия сақтау үшін тілдерді кэшіңізге жартылай жүктеп аламыз. + + Деректерді үнемдеу режимінде әрқашан жүктеп алу + + Жүктеп алу + + Жүктеп алу және аудару + + Бас тарту + + + + Жөндеу құралдары + + Артқа өту + + Беттер саймандары + + Беттер саны + + Белсенді + + Белсенді емес + + Жеке + + Барлығы + + Беттерді жасау құралы + + Жасау үшін беттер саны + + Белсенді беттерге қосу + + Белсенді емес беттерге қосу + + Жеке беттерге қосу diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 16db97f1b9c6..6f8b667f76e5 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -66,6 +66,19 @@ Efsaneyên berbelav ên têkildarî gerîna veşartî + + + Li ser vê cîhazê tu şop nehêle + + %1$s dema ku hûn hemî tabloyên xwe yên taybet digirin, çerezên we, dîrok û daneyên malperê jê dibe. %2$s + + Kî dikare karibe çalakiyên min bibîne? + Hilpekîna din a nepen bi tiliyekê veke. @@ -88,6 +101,11 @@ Li ser parastina xurekan a giştî agahî bistîne + + + Li vir bikirtîne da ku danişîneke taybet a nû dest pê bikî. Raboriya xwe, çerezên xwe - her tiştî jê bibe. + + Gihîna li kamerayê hewce ye. Here sazkariyên Androidê ji beşa destûran, destûrê bide. @@ -185,6 +203,8 @@ Pirtûkxane Malpera sermaseyê + + Di hilpekîneke asayî de veke Tevlî ekrana destpêkê bike @@ -225,6 +245,9 @@ Ekrana sereke + + Raboriya gerê jê bibe Zimanê hilbijartî @@ -239,7 +262,7 @@ Kodê bixwîne - Motora lêgerînê + Motora lêgerînê Sazkariyên motora lêgerînê @@ -302,43 +325,25 @@ Ne niha - - - %sê bike geroka xwe ya sereke - - Firefoxê bike geroka xwe ya sereke - - %1$s ji berjewendiyê zêdetir qîmetê dide mirovan û bi astengkirina şopînerên navmalperî nepeniya te diparêze.\n\nJi bo agahiyên zêdetir li %2$sê binêre. + + + Em ji parastina we hez dikin - danezana nepeniyê + danezana nepeniyê - Bike geroka sereke + Bike geroka sereke - Ne niha - - Ji telefonê derbasî kompîturê, ji kompîturê derbasî telefonê bibe - - Tab û şîfreyên ji cîhazên xwe yên din wergire û ji ciyê lê mayî dewam bike. + Ne niha - Têkeve + Têkeve - Ne niha - - Bi xêra agahdariyan bi %sê re zêdetir tiştan bike + Ne niha - - Hilpekînan ji cîhazekê bişîne ya din, jêbarkirinan bi rê ve bibe û derbarê %sê de zêdetir bizane. - Danezanan çalak bike + Danezanan çalak bike - Ne niha + Ne niha @@ -359,14 +364,10 @@ Derbar Yekê hilbijêre - - Kurterêyên lêgerînê bi rêve bibe Motora lêgerînê ya jixweber Lêgerîn - - Darika navnîşanê Li ser Google Playê puan bide - Agahdariya xurekan kêm bike + Agahdariya xurekan kêm bike - Agahdariyên xurekan kêm bike + Agahdariyên xurekan kêm bike - Girtî + Girtî - Vekirî + Vekirî - %1$s bixweber hewl dide ku daxwazên çerezên li ser bannerên çerezan red bike. + %1$s bixweber hewl dide ku daxwazên çerezên li ser bannerên çerezan red bike. Ji bo vê malperê girtî ye Betal - Piştgiriyê bixwaze - Daxwazê bişîne Ji bo vê malperê piştgiriyê dixwazî? @@ -424,26 +423,26 @@ Malper niha nayê piştgirîkirin - Bila ji bo %1$sê agahdariyên xurekê were vekirin? + Bila ji bo %1$sê agahdariyên xurekê were vekirin? - Bila ji bo %1$sê agahdariyên xurekê were girtin? + Bila ji bo %1$sê agahdariyên xurekê were girtin? - %1$s ew ê hemû xurekên malperê paqij bike û malperê nû bike. Paqijkirina hemû xurekan dibe ku têketina te bigire û sepeta te ya danûstandinê vala bike. + %1$s ew ê hemû xurekên malperê paqij bike û malperê nû bike. Paqijkirina hemû xurekan dibe ku têketina te bigire û sepeta te ya danûstandinê vala bike. - %1$s hewlêdidebide ku daxwazên çerezan yên li ser malperên piştgirîkirî bixweber red bike. + %1$s hewlêdidebide ku daxwazên çerezan yên li ser malperên piştgirîkirî bixweber red bike. - Destûrê didî %1$sê ku banerên çerezan red bike? + Destûrê didî %1$sê ku banerên çerezan red bike? - %1$s dikare gelek daxwazên banerên çerezan bixweber red bike. + %1$s dikare gelek daxwazên banerên çerezan bixweber red bike. - Ne niha + Ne niha - Tu yê hindiktir daxwazên çerezan bibînî + Tu yê hindiktir daxwazên çerezan bibînî - Destûrê bidê + Destûrê bidê Ji bo ewlekariya zêdetir hewlê bide ku bi protokola şîfrekirî ya HTTPSê bi awayekî xweber têkeve malperan. @@ -467,12 +466,8 @@ Lê îhtîmal heye ku sedem êrîşek be jî. Heke tu têkevî vê malperê, agahiyên xwe yên girîng pê re parve neke. Heke dewam bikî moda Tenê-HTTPS dê ji bo vê malperê bi awayê demdemî girtî be. Gihînbarî - - Servera taybet a hesabê Firefoxê Servera Sync’ê ya taybet - - Servera Sync/Hesabê Firefoxê hat guhertin. Ji bo sepandina guhertinan ji sepanê derdikeve… Hesab @@ -487,8 +482,6 @@ Taybet bike Ji bo senkronîzekirina hilpekînan, bijareyan, şîfreyan û tiştên din têkevê. - - Hesabê Firefoxê Ji bo senkronîzekirinê bidomînî, dîsa girê bide @@ -499,8 +492,6 @@ Berhevkirina daneyan Bi rêya USB’ê ji dûr ve neqandina çewtiyan - - Motorên lêgerînê nîşan bide Pêşniyarên lêgerînê nîşan bide @@ -594,12 +585,6 @@ Klasîk %s - - Edîsyona Sînorkirî - - Koleksiyana dengên serbixwe ya nû. %s - - Koleksiyana dengên serbixwe ya nû. Rengên cuda biceribîne @@ -607,13 +592,6 @@ Zêdetir wêneyên dîwêr bibîne - - - Pêvek nayê piştgirîkirin - - - Pêvek jixwe sazkirî ye - Hesabî bi rêve bibe @@ -915,10 +893,10 @@ Hilpekînan veke Navê koleksiyonê - - Nav biguherîne - - Rake + + Nav biguherîne + + Rake Ji raboriyê rake @@ -1188,10 +1166,10 @@ Parve bike Wekî PDF qeyd bike - + PDF nayê çêkirin - Nehate çapkirin + Nehate çapkirin Çap bike @@ -1333,13 +1311,9 @@ Hilpekînên vekirî %d hilpekîn - - Raboriya gerînê û daneyên malperê %d navnîşan - - Kûkî Têketinên te yên li ser gelek malperan dê bên girtin @@ -1392,62 +1366,10 @@ Kom hat jêbirin - - Tu bi xêr hatiyî înterneta baştir - - Gerokeke ji bo mirovan hatiye çêkirin, ne ji bo pereyan. - - Ji ciyê lê mayî dewam bike - - Ji bo derbasbûna bêproblem ya di navbera cîhazan de hilpekîn û şîfreyên xwe senkronîze bike. - - Têkeve Sync vekirî ye - - Parastina nihêniyê temî vekirî ye - - %1$s bi awayekî xweber asteng dike ku şirket te li ser webê bidizî bişopînin. - - Parastina çerezan ya bi temamî kodên şopandinê asteng dike ku nikaribin te li ser webê bişopînin. - - Standard (jixweber) - - Nepenî û performansa bi aheng. Rûpel bi asayî tên barkirin. - - Tund - - Ji bo rûpel zûtir bên vekirin zêdetir şopîneran asteng dike lê dibe ku hin fonksiyonên rûpelan xira bibin. - - Ciyê darikê amûran hilbijêre - - Li jêrê bihêle an jî bikişîne jorî. - - Kontrola daneyên te di destê te de ye - - Firefox kontrola hindê dide te ka tu li ser înternetê bi kesên din û bi me re çi parve dikî. - - Agahdariya me ya nihêniyê bixwîne - - - Tu amadeyî ku înterneteke nûwaze keşf bikî? - - Dest bi gerînê bike - - Rûkara xwe hilbijêre - - Bi moda tarî dikarî ji bataryayê teseruf bikî û çavên xwe vehesînî. - - Otomatîk - - Xwe li sazkariyên cîhaza te adabte dike - - Rûkara tarî - - Rûkara ronî - Hilpekîn hatin şandin! @@ -1857,25 +1779,15 @@ Motora lêgerînê sererast bike - - Tevlî bike - - Tomar bike Sererast bike Jê bibe - - Yên din Nav - - Nav Navê motora lêgerînê - - Rêzika lêgerînê ya ji bo bikaranînê Lêpirsînê bi “%s”ê pev biguherîne. Mînak:\nhttps://www.google.com/search?q=%s @@ -2009,14 +1921,14 @@ Baş e Kurterê - - Nav + + Nav Navê kurteriyê - - Baş e - - Betal bike + + Baş e + + Betal bike Eyar @@ -2093,6 +2005,15 @@ Here eyaran + + Zêdetir bizane + + polîtîkaya nihêniyê + + Polîtîkaya nihêniyê + + şert û mercên bikaranînê + teng bike @@ -2104,4 +2025,7 @@ gotarê bixwîne ji bo zêdetir bizanî lînkê veke - + + + + diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index cc1ee482dfee..6e4457b4bb05 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -74,11 +74,6 @@ 이 기기에 흔적을 남기지 마세요 - - %1$s는 모든 사생활 보호 창을 닫을 때 쿠키, 기록 및 사이트 데이터를 삭제합니다. %2$s 페이지에서 찾기 + + 페이지 번역 모음집에 저장 @@ -338,14 +335,8 @@ 나중에 - - Firefox를 기본 브라우저로 설정해 보세요 우리는 사용자를 안전하게 지키는 것을 좋아합니다 - - Firefox는 이익보다 사람을 우선시하고 교차 사이트 추적기를 차단하여 개인 정보를 보호합니다.\n\n개인정보처리방침에서 더 알아보세요. 당사의 비영리 지원 브라우저는 회사가 웹에서 비밀리에 사용자를 추적하는 것을 방지하는 데 도움이 됩니다.\n\n개인정보처리방침에서 더 알아보세요. 나중에 - 휴대전화에서 노트북으로 왔다가 다시 돌아가기 - 기기 간 이동 시 암호화 상태를 유지하세요 - - 다른 기기에서 탭과 비밀번호를 가져와 중단한 부분부터 다시 시작하세요. 로그인하고 동기화하면 더 안전해집니다. Firefox는 비밀번호, 북마크 등을 암호화합니다. @@ -368,15 +355,9 @@ 로그인 나중에 - - 알림은 Firefox로 더 많은 작업을 수행하는 데 도움이 됩니다 알림으로 Firefox를 더욱 안전하게 사용할 수 있습니다 - - 기기 간에 탭을 보내고, 다운로드를 관리하고, Firefox를 최대한 활용하기 위한 팁을 얻으세요. 기기 간에 안전하게 탭을 보내고 Firefox의 다른 개인 정보 보호 기능을 찾아보세요. @@ -420,8 +401,6 @@ 선택하세요 - 검색 바로 가기 관리 - 대체 검색 엔진 관리 검색 메뉴에 표시되는 엔진 편집 @@ -435,8 +414,6 @@ 검색 엔진 검색 엔진의 제안 - - 주소 표시줄 주소 표시줄 설정 @@ -560,14 +537,10 @@ 그러나, 공격자가 연루되었을 가능성도 있습니다. 웹 사이트를 방문하는 경우, 민감한 정보는 입력하지 않아야 합니다. 계속하면, 사이트에 대해 HTTPS 전용 모드가 일시적으로 꺼집니다. 접근성 - - 사용자 지정 Firefox 계정 서버 사용자 지정 Mozilla 계정 서버 사용자 지정 동기화 서버 - - Firefox 계정/동기화 서버가 변경되었습니다. 변경 사항을 적용하기 위해 애플리케이션을 종료하는 중… Mozilla 계정/동기화 서버가 수정되었습니다. 변경사항을 적용하기 위해 애플리케이션을 종료하는 중… @@ -585,8 +558,6 @@ 탭, 북마크, 비밀번호 등을 동기화하려면 로그인하세요. - Firefox 계정 - Mozilla 계정 다시 연결하여 동기화를 계속하세요 @@ -598,8 +569,6 @@ 데이터 수집 USB 원격 디버깅 - - 검색 엔진 표시 검색 제안 표시 @@ -732,12 +701,6 @@ 부가 기능 살펴보기 - - - 부가 기능이 지원되지 않음 - - 부가 기능이 이미 설치됨 - 부가 기능이 일시적으로 비활성화됨 @@ -1399,6 +1362,11 @@ 사생활 보호 탭 닫기 + + + 사생활 보호 탭을 닫으시겠습니까? + 사생활 보호 탭을 닫으려면 이 알림을 누르거나 미세요. + 마케팅 @@ -1645,6 +1613,8 @@ 모든 쿠키 (웹 사이트가 깨질 수 있음) 교차 사이트 쿠키 격리 + + 웹 사이트에 내 데이터를 공유하거나 판매하지 말라고 요청 추적 콘텐츠 @@ -1988,28 +1958,18 @@ 새 검색 엔진 추가 검색 엔진 편집 - - 추가 - - 저장 편집 삭제 - - 기타 이름 - - 이름 검색 엔진 이름 검색 URL 문자열 - 사용할 검색 문자열 - 검색에 사용할 URL 쿼리를 “%s”로 대체합니다. 예:\nhttps://www.google.com/search?q=%s @@ -2241,8 +2201,6 @@ - 리뷰 검사기 - 리뷰 검사기 신뢰할 수 있는 리뷰 @@ -2255,7 +2213,9 @@ 조정된 평점 - 신뢰할 수 없는 리뷰는 삭제됨 + 신뢰할 수 없는 리뷰는 삭제됨 + + 신뢰할 수 있는 리뷰에 바탕 최근 리뷰의 하이라이트 @@ -2266,14 +2226,10 @@ 문자 등급이 부여됩니다.]]> 신뢰할 수 있는 리뷰. 솔직하고 공정한 리뷰를 남긴 실제 고객의 리뷰일 가능성이 높다고 생각합니다. - - 신뢰할 수 있는 리뷰라고 생각합니다. 신뢰할 수 있는 리뷰와 신뢰할 수 없는 리뷰가 혼합되어 있다고 생각합니다. 신뢰할 수 없는 리뷰. 리뷰가 가짜이거나 편향된 리뷰어의 리뷰일 가능성이 있다고 생각합니다. - - 신뢰할 수 없는 리뷰라고 생각합니다. 조정된 평점은 신뢰할 수 있다고 믿는 리뷰만을 기반으로 합니다.]]> @@ -2289,8 +2245,6 @@ 리뷰 검사기에 광고 표시 - 관련 제품에 대한 광고가 가끔 표시됩니다. 모든 광고는 리뷰 품질 기준을 충족해야 합니다. %s - 관련 제품에 대한 광고가 가끔 표시됩니다. 믿을 수 있는 리뷰가 있는 제품만을 광고합니다. %s 더 알아보기 @@ -2313,23 +2267,23 @@ 이 제품에 대한 리뷰가 더 많아지면 품질을 확인할 수 있을 것입니다. - 제품을 사용할 수 없음 + 제품을 사용할 수 없음 - 이 제품이 재입고된 것을 확인하시면, 보고해 주시면 리뷰를 확인하도록 하겠습니다. + 이 제품이 재입고된 것을 확인하시면, 보고해 주시면 리뷰를 확인하도록 하겠습니다. - 이 제품이 재입고되었다고 보고 - - 제품 재고가 있다고 보고 + 제품 재고가 있다고 보고 - 리뷰 품질 확인 중 + 리뷰 품질 확인 중 - 리뷰 품질 확인 중 + 리뷰 품질 확인 중 + + 리뷰 품질 확인 중 (%s) 이 작업은 약 60초 정도 걸릴 수 있습니다. - 보고해 주셔서 감사합니다! + 보고해 주셔서 감사합니다! - 24시간 이내에 이 제품의 리뷰에 대한 정보를 받아야 합니다. 다시 확인해 주세요. + 24시간 이내에 이 제품의 리뷰에 대한 정보를 받아야 합니다. 다시 확인해 주세요. 리뷰를 확인할 수 없음 @@ -2367,17 +2321,17 @@ 더 알아보기 - "사용해보기"를 선택하면 Mozilla %2$s 및 %3$s의 %1$s에 동의하게 됩니다. + "사용해보기"를 선택하면 Mozilla %2$s 및 %3$s의 %1$s에 동의하게 됩니다. - "사용해보기"를 선택하면 %1$s의 다음 사항에 동의하게 됩니다: + "사용해보기"를 선택하면 %1$s의 다음 사항에 동의하게 됩니다: - 개인정보처리방침 + 개인정보처리방침 - 개인정보처리방침 + 개인정보처리방침 - 사용 약관 + 사용 약관 - 사용 약관 + 사용 약관 사용해보기 @@ -2414,6 +2368,9 @@ 경쟁력 + + “%s” + 접기 @@ -2431,4 +2388,207 @@ 더 알아보려면 링크 열기 %s, 제목 + + + 링크 + + 링크 사용 가능 + + + + + + 이 페이지를 번역할까요? + + %1$s에서 개인 정보가 보호되는 번역을 사용해 보세요 + + 개인 정보 보호를 위해 번역은 사용자의 기기를 떠나지 않습니다. 새로운 언어와 개선 사항이 곧 제공됩니다! %1$s + + 더 알아보기 + + 원본 언어: + + 대상 언어: + + 나중에 + + 완료 + + 번역 + + 다시 시도 + + 번역 중 + + 번역 진행 중 + + + 번역하는 중에 문제가 발생했습니다. 다시 시도하세요. + + 언어를 로드할 수 없습니다. 인터넷 연결을 확인하고 다시 시도하세요. + + 죄송합니다. 아직 %1$s 언어는 지원되지 않습니다. + + 더 알아보기 + + + + 번역 옵션 + + 항상 번역 제안 + + 항상 %1$s 번역 + + 항상 %1$s 번역 안 함 + + 항상 이 사이트 번역 안 함 + + 번역 설정 + + %1$s 번역 정보 + + + + 번역 + + 가능하면 번역 제안 + + 항상 데이터 절약 모드에서 언어 다운로드 + + 번역 설정 + + 자동 번역 + + 이 사이트 번역 안 함 + + 언어 다운로드 + + + + 자동 번역 + + + ”항상 번역“ 및 ”번역 안 함“ 설정을 관리할 언어를 선택하세요 + + + + 번역 제안 (기본값) + + %1$s는 이 언어로 된 사이트 번역을 제안합니다. + + 항상 번역 + + %1$s는 페이지가 로드될 때 이 언어를 자동으로 번역합니다. + + 번역 안 함 + + + %1$s는 이 언어로 된 사이트 번역을 제안하지 않습니다. + + + + 이 사이트 번역 안 함 + + 새 사이트를 추가하려면 해당 사이트를 방문하고 번역 메뉴에서 \'이 사이트 번역 안 함\'을 선택하세요. + + %1$s 제거 + + %1$s 사이트를 삭제하시겠습니까? + + 삭제 + + 취소 + + + + 언어 다운로드 + + 더 빠른 번역과 오프라인 번역을 위해 전체 언어를 다운로드하세요. %1$s + + 더 알아보기 + + 사용 가능한 언어 + + 필수 + + %1$s (%2$s) + + 언어 다운로드 + + 모든 언어 + + 삭제 + + 진행 중 + + 다운로드 + + 선택됨 + + + %1$s (%2$s) 언어를 삭제하시겠습니까? + + 이 언어를 삭제하면 번역할 때 %1$s는 언어 일부분를 캐시에 다운로드합니다. + + 모든 언어(%1$s)를 삭제하시겠습니까? + + 모든 언어를 삭제하면 번역할 때 %1$s는 언어 일부분를 캐시에 다운로드합니다. + + 삭제 + + 취소 + + + 데이터 절약 모드(%1$s)에 있는 동안 다운로드하시겠습니까? + + + 개인 정보 보호를 위해 언어 일부분을 캐시에 다운로드합니다. + + + 항상 데이터 절약 모드에서 다운로드 + + 다운로드 + + 다운로드하고 번역 + + 취소 + + + + 디버그 도구 + + 뒤로 + + 탭 도구 + + 탭 수 + + 활성 + + 비활성 + + 사생활 + + 전체 + + 탭 생성 도구 + + 생성할 탭 수량 + + 활성 탭에 추가 + + 비활성 탭에 추가 + + 사생활 보호 탭에 추가 diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 2b4310ddd71c..c6bf155c6c7b 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -68,11 +68,6 @@ Etterlat ingen spor på denne enheten - - %1$s sletter infokapsler, historikk og nettstedsdata når du lukker alle dine private vinduer. %2$s - - Bruk Firefox som din favorittnettleser Vi beskytter deg gjerne - - Firefox setter mennesker over fortjeneste og forsvarer personvernet ditt ved å blokkere sporere på tvers av nettsteder.\n\nFinn ut mer i personvernerklæringen vår. Vår ideelle nettleser forhindrer selskaper i å spore aktiviteten din i hemmelighet på nettet.\n\nLes mer i personvernerklæringen vår. Ikke nå - Bytt fra telefon til bærbar PC og tilbake - Krypter dataene dine når du arbeider på tvers av enheter - - Hent faner og passord fra de andre enhetene dine for å fortsette der du sluttet. Når du er inlogget og synkronisert, er du tryggere. Firefox krypterer passordene, bokmerkene og mer. @@ -361,15 +346,9 @@ Logg inn Ikke nå - - Varsler hjelper deg å gjøre mer med Firefox Varsler hjelper deg å holde deg tryggere med Firefox - - Send faner mellom enheter, behandle nedlastinger og få tips om hvordan du får mest mulig ut av Firefox. Send faner sikkert mellom enhetene dine og oppdag andre personvernfunksjoner i Firefox. @@ -411,8 +390,6 @@ Velg en - Behandle søkesnarveier - Behandle alternative søkemotorer Rediger motorer som er synlige i søkemenyen @@ -426,8 +403,6 @@ Søkemotorer Forslag fra søkemotorer - - Adresselinje Innstillinger for adresselinjen @@ -505,7 +480,7 @@ %1$s vill slette infokapsler og oppdatere siden. Sletting av alle infokapsler kan føre til at du blir logget ut eller at handlekurver blir tømt. - Slå av og %1$s sletter infokapsler og laster inn dette nettstedet på nytt. Dette kan logge deg ut eller tømme handlekurver. + Slå av, og %1$s sletter infokapsler og laster inn dette nettstedet på nytt. Dette kan logge deg ut eller tømme handlekurver. %1$s prøver å automatisk avvise alle infokapselforespørsler på støttede nettsteder. @@ -549,14 +524,10 @@ Det er imidlertid også mulig at en angriper er involvert. Hvis du fortsetter til nettstedet, bør du ikke oppgi noen sensitiv informasjon. Hvis du fortsetter, vil bare HTTPS-modus bli slått av midlertidig for nettstedet. Tilgjengelighet - - Selvvalgt server for Firefox-konto Selvvalgt server for Mozilla-konto Selvvalgt synkroniseringsserver - - Firefox-konto/synkroniseringsserver endret. Avslutter applikasjonen for å legge til endringer… Mozilla-konto/synkroniseringsserver endret. Avslutter applikasjonen for å legge til endringer… @@ -574,8 +545,6 @@ Logg inn for å synkronisere faner, bokmerker, passord med mer. - Firefox-konto - Mozilla-konto Koble til igjen for å fortsette synkroniseringen @@ -588,8 +557,6 @@ Fjernfeilsøking via USB - - Vis søkemotorer Vis søkeforslag @@ -720,12 +687,6 @@ Utforsk utvidelser - - - Tillegget støttes ikke - - Tillegget er allerede installert - Tillegg er midlertidig deaktivert @@ -1602,6 +1563,8 @@ Alle infokapsler (vil føre til feil på nettsteder) Isoler infokapsler på tvers av nettsteder + + Fortell nettsteder om ikke å dele eller selge mine data Sporingsinnhold @@ -1946,28 +1909,18 @@ Legg til ny søkemotor Rediger søkemotor - - Legg til - - Lagre Rediger Slett - - Andre Navn - - Navn Søkemotornavn Søkestreng-URL - Søkestreng å bruke - URL å bruke for søk Bytt ut spørringen med «%s». Eksempel:\nhttps://www.google.com/search?q=%s @@ -2198,8 +2151,6 @@ - Vurderingskontrollør - Vurderingskontrollør Pålitelige vurderinger @@ -2212,7 +2163,9 @@ Justert vurdering - Upålitelige vuderinger er fjernet + Upålitelige vuderinger er fjernet + + Basert på pålitelige vurderinger Høydepunkter fra nylige vurderinger @@ -2223,14 +2176,10 @@ bokstavkarakter fra A til F.]]> Pålitelige vurderinger. Vi tror at vurderingene sannsynligvis kommer fra ekte kunder som har gitt ærlige, objektive vurderinger. - - Vi mener vurderingene er pålitelige. Vi tror det er en blanding av pålitelige og upålitelige vurderinger. Upålitelige vurderinger. Vi mener vurderingene sannsynligvis er falske eller fra partiske vurderere. - - Vi mener vurderingene er upålitelige. justerte vurderingen er kun basert på vurderinger vi mener er pålitelige.]]> @@ -2246,8 +2195,6 @@ Vis annonser i vurderingskontrolløren - Du ser sporadiske annonser for relevante produkter. Alle annonser må oppfylle kvalitetsstandardene våre for vurderinger. %s - Du ser sporadiske annonser for relevante produkter. Vi annonserer kun produkter med pålitelige vurderinger. %s Les mer @@ -2270,23 +2217,23 @@ Når dette produktet har flere vurderinger, kan vi sjekke kvaliteten. - Produktet er ikke tilgjengelig + Produktet er ikke tilgjengelig - Hvis du ser at dette produktet er tilbake på lager, rapporter det og vi vil jobbe med å sjekke vurderingene. - - Rapporter at dette produktet er tilbake på lager + Hvis du ser at dette produktet er tilbake på lager, rapporter det og vi vil jobbe med å sjekke vurderingene. - Rapporter at produktet er på lager + Rapporter at produktet er på lager - Kontrollerer kvaliteten på vurderingen + Kontrollerer kvaliteten på vurderingen - Kontrollerer kvaliteten på vurderingen + Kontrollerer kvaliteten på vurderingen + + Kontrollerer kvaliteten på vurderingen (%s) Dette kan ta cirka 60 sekunder. - Takk for at du rapporterte! + Takk for at du rapporterte! - Vi bør ha informasjon om dette produktets anmeldelser innen 24 timer. Sjekk igjen senere. + Vi bør ha informasjon om dette produktets anmeldelser innen 24 timer. Sjekk igjen senere. Vi kan ikke sjekke disse vurderingene @@ -2372,6 +2319,9 @@ Konkurranseevne + + “%s” + slå sammen @@ -2389,4 +2339,68 @@ åpne lenken for å lese mer %s, Overskrift - + + + + + + Automatisk oversettelse + + + Velg et språk for å behandle innstillinger for «oversett alltid» og «oversett aldri». + + + + Tilby å oversette (standard) + + %1$s vil tilby å oversette nettsteder på dette språket. + + Oversett alltid + + %1$s vil oversette dette språket automatisk når siden lastes inn. + + Oversett aldri + + %1$s vil aldri tilby å oversette nettsteder på dette språket. + + + + Oversett aldri disse nettstedene + + For å legge til et nytt nettsted: Besøk det og velg «Oversett aldri dette nettstedet» fra oversettelsesmenyen. + + Fjern %1$s + + Vil du slette %1$s? + + Slett + + Avbryt + + + + Last ned språk + + Last ned komplette språk for raskere oversettelser og for å oversette frakoblet. %1$s + + Les mer + + Tilgjengelige språk + + nødvendig + + Last ned språk + + Alle språk + + Slett + + Pågår + + Last ned + + Valgt + + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 2c30ffaeb3d4..7ed3c1d2dba2 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -74,11 +74,6 @@ Laat geen sporen achter op dit apparaat - - %1$s verwijdert uw cookies, geschiedenis en websitegegevens wanneer u al uw privévensters sluit. %2$s Zoeken op pagina + + Pagina vertalen In collectie opslaan @@ -337,14 +334,8 @@ Niet nu - - Maak Firefox uw ‘ga naar’-browser We houden u graag veilig - - Firefox plaatst mensen boven winst en verdedigt uw privacy door cross-sitetrackers te blokkeren.\n\nMeer info in onze privacyverklaring. Onze door een non-profitorganisatie ondersteunde browser helpt voorkomen dat bedrijven u stiekem volgen op internet.\n\nMeer info in onze privacyverklaring. Niet nu - Spring van telefoon naar laptop en terug - Blijf versleuteld wanneer u van apparaat wisselt - - Pik tabbladen en wachtwoorden op van uw andere apparaten om verder te gaan waar u was gebleven. Wanneer u aangemeld en gesynchroniseerd bent, bent u veiliger. Firefox versleutelt uw wachtwoorden, bladwijzers en meer. @@ -367,15 +354,9 @@ Aanmelden Niet nu - - Meldingen helpen u meer te doen met Firefox Meldingen helpen u veiliger te blijven met Firefox - - Verzend tabbladen tussen apparaten, beheer downloads en ontvang tips om Firefox optimaal te benutten. Verzend veilig tabbladen tussen uw apparaten en ontdek andere privacyfuncties in Firefox. @@ -417,8 +398,6 @@ Selecteer er een - Zoeksnelkoppelingen beheren - Alternatieve zoekmachines beheren In het zoekmenu zichtbare zoekmachines bewerken @@ -432,8 +411,6 @@ Zoekmachines Suggesties van zoekmachines - - Adresbalk Adresbalkvoorkeuren @@ -555,14 +532,10 @@ Het is echter ook mogelijk dat er een aanvaller bij betrokken is. Als u doorgaat naar de website, voer dan geen gevoelige informatie in. Als u doorgaat, wordt de Alleen-HTTPS-modus tijdelijk uitgeschakeld voor de website. Toegankelijkheid - - Aangepaste Firefox Accountserver Aangepaste Mozilla-accountserver Aangepaste Syncserver - - Firefox Account-/Syncserver aangepast. Toepassing wordt afgesloten om wijzigingen toe te passen… Mozilla-account-/Synchronisatieserver aangepast. Toepassing wordt afgesloten om wijzigingen toe te passen… @@ -580,8 +553,6 @@ Meld u aan om uw tabbladen, bladwijzers, wachtwoorden en meer te synchroniseren. - Firefox-account - Mozilla-account Verbind opnieuw om de synchronisatie te hervatten @@ -593,8 +564,6 @@ Gegevensverzameling Remote debugging via USB - - Zoekmachines tonen Zoeksuggesties tonen @@ -727,12 +696,6 @@ Add-ons verkennen - - - Add-on wordt niet ondersteund - - Add-on is al geïnstalleerd - Add-ons zijn tijdelijk uitgeschakeld @@ -1373,6 +1336,12 @@ Privétabbladen sluiten + + + Privétabbladen sluiten? + + Tik of veeg deze melding om privétabbladen te sluiten. + Marketing @@ -1609,6 +1578,8 @@ Alle cookies (zal ervoor zorgen dat websites niet goed werken) Cross-sitecookies isoleren + + Websites vertellen gegevens niet te verkopen en te delen Volginhoud @@ -1947,28 +1918,18 @@ Nieuwe zoekmachine toevoegen Zoekmachine bewerken - - Toevoegen - - Opslaan Bewerken Verwijderen - - Overig Naam - - Naam Naam van zoekmachine Zoekterm-URL - Te gebruiken zoekterm - Voor de zoekopdracht te gebruiken URL Zoekvraag vervangen door ‘%s’. Bijvoorbeeld: \nhttps://www.google.com/search?q=%s @@ -2198,8 +2159,6 @@ - Beoordelingscontrole - Beoordelingscontrole Betrouwbare beoordelingen @@ -2212,7 +2171,9 @@ Aangepaste waardering - Onbetrouwbare beoordelingen verwijderd + Onbetrouwbare beoordelingen verwijderd + + Gebaseerd op betrouwbare beoordelingen Hoogtepunten uit recente beoordelingen @@ -2223,14 +2184,10 @@ letterwaarde toe, van A tot F.]]> Betrouwbare beoordelingen. Wij zijn van mening dat de beoordelingen waarschijnlijk afkomstig zijn van echte klanten die eerlijke, onpartijdige beoordelingen hebben achtergelaten. - - Wij denken dat de beoordelingen betrouwbaar zijn. Wij geloven dat er een mix is van betrouwbare en onbetrouwbare beoordelingen. Onbetrouwbare beoordelingen. Wij zijn van mening dat de beoordelingen waarschijnlijk nep zijn of afkomstig zijn van bevooroordeelde beoordelaars. - - Wij denken dat de beoordelingen niet betrouwbaar zijn. aangepaste waardering is alleen gebaseerd op beoordelingen die wij betrouwbaar achten.]]> @@ -2246,8 +2203,6 @@ Advertenties tonen in beoordelingscontrole - U ziet af en toe advertenties voor relevante producten. Alle advertenties moeten voldoen aan onze kwaliteitsnormen voor beoordelingen. %s - U ziet af en toe advertenties voor relevante producten. We adverteren alleen voor producten met betrouwbare beoordelingen. %s Meer info @@ -2270,23 +2225,23 @@ Wanneer dit product meer beoordelingen heeft, kunnen we hun kwaliteit beoordelen. - Product is niet beschikbaar + Product is niet beschikbaar - Als u ziet dat dit product weer op voorraad is, meld dit dan aan ons en wij zullen eraan werken om de beoordelingen te controleren. + Als u ziet dat dit product weer op voorraad is, meld dit dan aan ons en wij zullen eraan werken om de beoordelingen te controleren. - Melden dat dit product weer op voorraad is - - Rapporteren dat product op voorraad is + Rapporteren dat product op voorraad is - Beoordelingskwaliteit controleren + Beoordelingskwaliteit controleren - Beoordelingskwaliteit controleren + Beoordelingskwaliteit controleren + + Beoordelingskwaliteit controleren (%s) Dit kan ongeveer 60 seconden duren. - Bedankt voor het melden! + Bedankt voor het melden! - We zouden binnen 24 uur info over de beoordelingen van dit product moeten hebben. Kom later nog eens terug. + We zouden binnen 24 uur info over de beoordelingen van dit product moeten hebben. Kom later nog eens terug. We kunnen deze beoordelingen niet controleren @@ -2324,18 +2279,18 @@ Meer info - Door ‘Ja, proberen’ te selecteren, gaat u akkoord met het %2$s en de %3$s van %1$s door Mozilla. + Door ‘Ja, proberen’ te selecteren, gaat u akkoord met het %2$s en de %3$s van %1$s door Mozilla. - Door ‘Ja, proberen’ te selecteren, gaat u akkoord met het volgende van %1$s: + Door ‘Ja, proberen’ te selecteren, gaat u akkoord met het volgende van %1$s: - privacybeleid + privacybeleid - Privacybeleid + Privacybeleid - gebruiksvoorwaarden + gebruiksvoorwaarden - Gebruiksvoorwaarden + Gebruiksvoorwaarden Ja, proberen @@ -2372,6 +2327,9 @@ Concurrentievermogen + + ‘%s’ + samenvouwen @@ -2389,4 +2347,205 @@ de koppeling te openen voor meer info %s, koptekst + + + Koppelingen + + Beschikbare koppelingen + + + + + + Deze pagina vertalen? + + + Probeer privévertalingen in %1$s + + Voor uw privacy verlaten vertalingen uw apparaat nooit. Binnenkort nieuwe talen en verbeteringen! %1$s + + Meer info + + Vertalen vanuit het + + Vertalen naar het + + Niet nu + + Gereed + + Vertalen + + Opnieuw proberen + + Vertalen + + Vertaling wordt uitgevoerd + + + Er is een probleem opgetreden bij het vertalen. Probeer het opnieuw. + + Kan talen niet laden. Controleer uw internetverbinding en probeer het opnieuw. + + Sorry, we ondersteunen %1$s nog niet. + + Meer info + + + + Vertaalopties + + Altijd aanbieden om te vertalen + + %1$s altijd vertalen + + %1$s nooit vertalen + + Deze website nooit vertalen + + Vertaalinstellingen + + Over vertalingen in %1$s + + + + Vertalingen + + Aanbieden te vertalen wanneer mogelijk + + Talen altijd downloaden in gegevensbesparingsmodus + + Vertaalvoorkeuren + + Automatische vertaling + + Deze websites nooit vertalen + + Talen downloaden + + + + Automatische vertaling + + + Selecteer een taal om de voorkeuren ‘Altijd vertalen’ en ‘Nooit vertalen’ te beheren. + + + + Aanbieden om te vertalen (standaard) + + %1$s zal aanbieden websites in deze taal te vertalen. + + Altijd vertalen + + %1$s zal deze taal automatisch vertalen als de pagina wordt geladen. + + Nooit vertalen + + %1$s zal nooit aanbieden websites in deze taal te vertalen. + + + + Deze websites nooit vertalen + + Om een nieuwe website toe te voegen: bezoek deze en selecteer ‘Deze website nooit vertalen’ in het vertaalmenu. + + %1$s verwijderen + + %1$s verwijderen? + + Verwijderen + + Annuleren + + + + Talen downloaden + + Download volledige talen voor snellere vertalingen en offline te vertalen. %1$s + + Meer info + + Beschikbare talen + + vereist + + %1$s (%2$s) + + Talen downloaden + + Alle talen + + Verwijderen + + Wordt uitgevoerd + + Downloaden + + Geselecteerd + + + %1$s (%2$s) verwijderen? + + Als u deze taal verwijdert, zal %1$s gedeeltelijke talen naar uw buffer downloaden terwijl u vertaalt. + + Alle talen (%1$s) verwijderen? + + Als u alle talen verwijdert, zal %1$s gedeeltelijke talen naar uw buffer downloaden terwijl u vertaalt. + + Verwijderen + + Annuleren + + + Downloaden in gegevensbesparingsmodus (%1$s)? + + We downloaden gedeeltelijke talen naar uw buffer om vertalingen privé te houden. + + Altijd downloaden in gegevensbesparingsmodus + + Downloaden + + Downloaden en vertalen + + Annuleren + + + + Hulpmiddelen voor debuggen + + Terug bladeren + + Tabbladhulpmiddelen + + Aantal tabbladen + + Actief + + Inactief + + Privé + + Totaal + + Hulpmiddel voor het aanmaken van tabbladen + + Aantal aan te maken tabbladen + + Toevoegen aan actieve tabbladen + + Toevoegen aan inactieve tabbladen + + Toevoegen aan privétabbladen diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index 949d7120e199..bd93a9b287f0 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -72,11 +72,6 @@ Etterlèt ingen spor på denne eininga - - %1$s slettar alle infokaspslar, historikk og nettstaddata når du lèt att alle private vindauge. %2$s Finn på sida + + Omset sida Lagre i samling @@ -335,14 +332,8 @@ Ikkje no - - Bruk Firefox som din faforittnettlesar Vi vernar deg gjerne - - Firefox set menneske over forteneste og forsvarar retten din til personvern ved å blokkere sporarar på fleire nettstadar.\n\nLes meir i personvernerklæringa vår. peronvernerklæring @@ -351,21 +342,11 @@ Ikkje no - Hopp frå telefonen til datamaskina og tilbake - Krypter dataa dine når du arbeider på tvers av einingar - - Hent faner og passord frå dei andre einingane dine for å halde fram der du slapp. Logg inn Ikkje no - - Varsel hjelper deg å gjere meir med Firefox - - Send faner mellom einingar, administrer nedlastingar og få tips om korleis du får mest muleg ut av Firefox. Slå på varsel @@ -405,7 +386,7 @@ Vel ein - Handsam søkjesnarvegar + Handsam alternative søkjemotorar Rediger motorar som er synlege i søkjemenyen @@ -416,8 +397,10 @@ Søk Søkjemotorar - - Adresselinje + + Forslag frå søkjemotorar + + Les meir om Firefox forslag Vurder på Google Play Redusering av infokapselbanner + + Blokkering av infokapselbanner + + Blokkering av infokapselbanner i privat nettlesing Reduser infokapselbanner @@ -473,14 +460,22 @@ Nettstaden er for augneblinken ikkje støtta Vill du aktivere reduksjon av infokapselbanner for %1$s? + + Vil du slå på blokkering av infokapselbanner for %1$s? Vil du deaktivere reduksjon av infokapselbanner for %1$s? + + Vil du slå av blokkering av infokapselbanner for %1$s? %1$s kan ikkje automatisk avvise førespurnadar om infokapslar på denne nettstaden. Du kan sende ein førespurnad om å støtte denne nettstaden i framtida. %1$s vill slette infokapslar og oppdatere sida. Sletting av alle infokapslar kan føre til at du blir logga ut eller at handlekorger vert tømde. + + Slå av, og %1$s slettar infokapslar og lastar inn denne nettstaden på nytt. Dette kan logge deg ut eller tøme handlekorger. %1$s prøver å automatisk avvise alle infokapselførespurnadar på støtta nettstadar. + + Slå på, og %1$s vil prøve å automatisk nekte infokapselbanner på denne nettstaden. Tilate %1$s å avvise infokapselbanner? @@ -493,6 +488,11 @@ Tillat + + %1$s nekta nettopp infokapslar for deg + + Færre distraksjonar, færre infokapslar som sporar deg på denne sida. + Prøver automatisk å kople til nettstadar ved hjelp av HTTPS-krypteringsprotokollen for auka sikkerheit. @@ -515,14 +515,10 @@ Det er òg mogleg at ein angripar er involvert. Dersom du fortset til nettstaden, bør du ikkje skrive inn sensitiv informasjon. Dersom du fortset, vil berre HTTPS-modus bli slått av mellombels for nettstaden. Tilgjenge - - Tilpassa server for Firefox-konto Tilpassa Mozilla-kontoserver Tilpassa synkroniseringsserver - - Firefox-konto/synkroniseringsserver endra. Avsluttar applikasjonen for å bruke endringar… Mozilla-konto/synkroniseringsserver er endra. Avsluttar programmet for å kunne bruke endringane… @@ -541,8 +537,6 @@ Logg inn for å synkronisere faner, bokmerke, passord med meir. - Firefox-konto - Mozilla-konto Kople til igjen for å halde fram synkroniseringa @@ -555,8 +549,6 @@ Fjernfeilsøking via USB - - Vis søkjemotorar Vis søkjeforslag @@ -678,12 +670,6 @@ Utforsk fleire bakgrunnsbilde - - - Tillegget er ikkje støtta - - Tillegget er allereie installert - Tillegg er mellombels deaktivert @@ -1327,6 +1313,7 @@ Lat att private faner + Marknadsføring @@ -1907,28 +1894,18 @@ Legg til ny s;kjemotor Rediger søkjemotor - - Legg til - - Lagre Rediger Slett - - Andre Namn - - Namn Søkjemotornamn Søkjestreng-URL - Søkjestreng å bruke - URL å bruke for søk Byt ut spørjinga med «%s». Eksempel:\nhttps://www.google.com/search?q=%s @@ -2162,8 +2139,6 @@ - Vurderingskontrollør - Vurderingskontrollør Pålitelege vurderingar @@ -2176,7 +2151,7 @@ Juster vurdering - Upålitelege vurderingar er fjerna + Upålitelege vurderingar er fjerna Høgdepunkt frå nylege vurderingar @@ -2187,14 +2162,10 @@ bokstavkarakter frå A til F.]]> Pålitelege vurderingar. Vi meinar at vureringane truleg kjem frå ekte kundar som har lagt att ærlege, upartiske vurderingar. - - Vi meiner at vurderingane er til å stole på. Vi meinar at det finst ei blanding av pålitelege og upålitelege vurderingar. Upålitelege vurderingar. Vi meinar at vurderingane sannsynlegvis er falske, eller frå partiske kritikarar. - - Vi meiner at vurderingane ikkje er til å stole på. justerte vurderinga er berre basert på vurderingar vi meiner er pålitelege.]]> @@ -2208,8 +2179,6 @@ Vis annonsar i vurderingskontrolløren - Du vil av og til sjå annonsar for relevante produkt. Alle annonsar må oppfylle kvalitetsstandardane våre for vurderingar. %s - Du vil av og til sjå reklame for relevante produkt. Vi reklamerer berre for produkt med pålitelege vurderingar. %s Les meir @@ -2220,8 +2189,6 @@ Annonse frå %s - Vurderingskontrollør driven av %s. - Vurderingskontrollør driven av %s %s av Mozilla @@ -2234,23 +2201,21 @@ Når dette produktet har fleire vurderingar, kan vi sjekke kvaliteten. - Produktet er ikkje tilgjengeleg + Produktet er ikkje tilgjengeleg - Om du ser at dette produktet er tilbake på lager, rapporter det, så jobbar vi med å kontrollere vurderingane. - - Rapporter at dette produktet er tilbake på lager + Om du ser at dette produktet er tilbake på lager, rapporter det, så jobbar vi med å kontrollere vurderingane. - Rapporter at produktet er på lager + Rapporter at produktet er på lager - Kontrollerer kvaliteten på vurderinga + Kontrollerer kvaliteten på vurderinga - Kontrollerer kvaliteten på vurderinga + Kontrollerer kvaliteten på vurderinga Dette vil ta omlag 60 sekund. - Takk for at du rapporterer! + Takk for at du rapporterer! - Vi bør ha informasjon om vurderingane til dette produktet innan 24 timar. Sjekk igjen litt seinare. + Vi bør ha informasjon om vurderingane til dette produktet innan 24 timar. Sjekk igjen litt seinare. Vi klarer ikkje å kontrollere desse vurderingane @@ -2286,15 +2251,15 @@ Les meir - Ved å velje «Ja, prøv det» seier du deg samd i %1$s av Mozillas %2$s og %3$s. + Ved å velje «Ja, prøv det» seier du deg samd i %1$s av Mozillas %2$s og %3$s. - personvernpraksis + personvernpraksis - Personvernerklæring + Personvernerklæring - brukarvilkår + brukarvilkår - Brukarvilkår + Brukarvilkår Ja, prøv det @@ -2345,4 +2310,143 @@ les artikkelen opne lenke for å lese meir - + + %s, overskrift + + + Lenker + + + + + + Omsetje denne sida? + + Les meir + + Omset frå + + Omset til + + Ikkje no + + Ferdig + + Omset + + Prøv på nytt + + Omset + + Omsetjing i framdrift + + + Det oppstod eit problem med å omsetje. Prøv på nytt. + + Les meir + + + + Innstillingar for omsetjing + + Tilby alltid å omsetje + + Omset alltid %1$s + + Omset aldri %1$s + + Aldri omset denne nettstaden + + Innstillingar for omsetjing + + Om omsetjingar i %1$s + + + + Omsetjingar + + + Innstillingar for omsetjing + + Automatisk omsetjing + + Omset aldri desse nettstadane + + Last ned språk + + + + Automatisk omsetjing + + + Omset alltid + + Omset aldri + + + Fjern %1$s + + Vil du slette %1$s? + + Slett + + Avbryt + + + + Last ned språk + + Les meir + + Tilgjengelege språk + + påkravd + + %1$s (%2$s) + + Last ned språk + + Alle språk + + Slett + + I framdrift + + Last ned + + Valt + + + Slett %1$s (%2$s)? + + + Slett + + Avbryt + + + Last ned + + Last ned og omset + + Avbryt + + + Faneverktøy + + Antal faner + + Aktiv + + Inaktiv + + Privat + + Totalt + diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 11a222d14110..19477523ff11 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -67,11 +67,6 @@ Daissatz pas cap de traça sus aqueste aparelh - - %1$s suprimís los cookies, l’istoric e las donadas de sites quand tampatz totas las fenèstras privadas. %2$s Recercar dins la pagina + + Traduire la pagina Salvar a la colleccion @@ -330,14 +327,8 @@ Mai tard - - Far de Firefox vòstre navegador per defaut Nos impòrta vòstra vida privada - - Firefox considèra la gent abans l’argent e defend vòstra vida privada en blocant los traçadors intersites.\n\nAprenètz-ne mai dins nòstre nòta sus la confidencialitat. Nòstre navegador sostengut per una organizacion sens but lucratiu empacha las entrepresas de vos seguir secrètament sul Web.\n\nPer ne saber mai consultatz nòstra politica de confidencialitat. Pas ara - Basculatz del mobil a l’ordenador e invèrsament - Demoratz en lòc segur amb lo chiframent quand basculatz d’aparelh - - Trapatz los onglets e senhals d’autres aparelhs per tornar ont eratz. Quand vos connectatz e activatz la sincronizacion, vòstra seguretat es renfortida. Firefox chifra vòstres senhals, marcapaginas e encara mai de causas. @@ -360,15 +347,9 @@ Connexion Pas ara - - Las notificacions vos ajudan a ne far mai amb Firefox Las notificacions vos ajudan a demorar en seguretat amb Firefox - - Enviatz los onglets d’un aparelh a l’autre, gerissètz los telecargaments e obtenètz de conselhs per ne far encara mai amb Firefox. Enviatz d’onglets d’un aparelh a l’autre en tot seguretat e descobrissètz d’autras foncionalitats de proteccion de la vida privada de Firefox. @@ -410,8 +391,6 @@ Seleccionatz-ne un - Gerir los acorchis de recèrca - Gerir los motors de recèrcas alternatius Modificar los motors de recèrca visibles al menú de recèrca @@ -425,8 +404,6 @@ Motors de recèrca Suggestions dels motors de recèrcas - - Barra d‘adreça Preferéncias de la barra d’adreça @@ -552,14 +529,10 @@ Pasmens es tanben possible qu’un atacaire siá implicat. Se contunhatz sus aqueste site, deuriatz pas dintrar d’informacions confidencialas. Dins aqueste cas lo mòde HTTPS solament serà temporàriament desactivat per aqueste site. Accessibilitat - - Servidor de compte Firefox personalizat Servidor de compte Mozilla personalizat Servidor Sync personalizat - - Servidor de compte o de sincronozacion modificat. L’aplicacion se tanca per aplicar las modificacions… Servidor de sincronizacion o compte Mozilla modificat. Tampadura de l’aplicacion per aplicar las modificacions… @@ -577,8 +550,6 @@ Connectatz-vos per sincronizar onglets, marcapaginas, senhals e plan mai encara. - Compte Firefox - Compte Mozilla Tornatz vos connectar per reprendre la sincronizacion @@ -591,8 +562,6 @@ Culhida de donadas Desbugatge distant per USB - - Mostrar motors de recèrca Mostrar las suggestions de recèrca @@ -727,15 +696,11 @@ Percórrer los moduls - - - Lo modul complementari es pas pres en carga - - Lo modul complementari es ja installat - Los moduls son temporàriament desactivats + + Un o mai d’un modul complementari an quitat de foncionar, çò que fa venir lo sistèma instable. %1$s a pas capitat a reaviar los moduls.\n\n Se relançaràn pas los moduls pendent la session actuala.\n\nLa supression o desactivacion dels moduls pòt corregir aquesta anomalia. Relançar los moduls @@ -1377,6 +1342,12 @@ Tampar los onglets privats + + + Tampar los onglets privats ? + + Tocatz o fasètz lisar aquesta notificacion per tampar los onglets privats. + Marketing @@ -1618,6 +1589,8 @@ Totes los cookies (pòt arribar que d’unes sites quitan de foncionar) Isolar los cookies intersites + + Demandar als sites web de vendre nimai partejar mas donadas Contengut utilizat pel seguiment @@ -1967,28 +1940,18 @@ Apondre un motor de recèrca novèl Modificar lo motor de recèrca - - Apondre - - Enregistrar Modificar Suprimir - - Autre Nom - - Nom Nom del motor de recèrca URL del motor de recèrca - Cadena de recèrca d’utilizar - URL d’utilizar per las recèrcas Remplaçar los tèrmes de la recèrca per « %s ». Per exemple :\nhttps://www.google.com/search?q=%s @@ -2222,8 +2185,6 @@ Exemple :\nhttps://suggestqueries.google.com/complete/search?client=firefox& - Verificador d’avises - Verificador d’avises Avises fisables @@ -2236,15 +2197,29 @@ Exemple :\nhttps://suggestqueries.google.com/complete/search?client=firefox& Evaluacion corregida - Avises non fisables suprimits + Avises non fisables suprimits + + Elaborat amb d’avises fisables Elements essencials dels avises recents Coma determinam la qualitat d’un avís + + notacion alfabetica de A a F.]]> + + Avises fisables. Pensam que los avises venon probablament de vertadièrs clients que daissèron d’avises sincèrs e objectius. + + Pensam que los avises mesclan d’avises fisables e non fisables. Per ne saber mai sus %s. + + cossí %s per Mozilla determina la qualitat de l’avís + + cossí %s determina la qualitat de l’avís Paramètres + + Afichar de publicitats dins lo verificador d’avises Ne saber mai @@ -2257,14 +2232,18 @@ Exemple :\nhttps://suggestqueries.google.com/complete/search?client=firefox& Lo verificador d’avises fonciona gràcia a %s %s per Mozilla + + Informacions novèlas d’evaluar Verificar ara - Lo produit es pas disponible + Lo produit es pas disponible Las analisis son a jorn Plan realizat + + Cap d’info pas disponible pel moment Cap de connexion ret @@ -2272,13 +2251,13 @@ Exemple :\nhttps://suggestqueries.google.com/complete/search?client=firefox& Ne saber mai - politica de confidencialitat + politica de confidencialitat - Politica de confidencialitat + Politica de confidencialitat - condicions d’utilizacion + condicions d’utilizacion - Condicions d’utilizacion + Condicions d’utilizacion Òc-ben, ensajar @@ -2311,6 +2290,9 @@ Exemple :\nhttps://suggestqueries.google.com/complete/search?client=firefox& Competitivitat + + « %s » + plegar @@ -2328,4 +2310,207 @@ Exemple :\nhttps://suggestqueries.google.com/complete/search?client=firefox& dobrissètz lo ligam per ne saber mai %s, títol + + + Ligams + + Ligams disponibles + + + + + + Traduire aquesta pagina ? + + Ensajar las traduccions privadas dins %1$s + + Per respectar vòstra vida privada, las traduccions quitan pas jamai vòstre aparelh. De lengas e amelhoraments novèls seràn lèu disponibles ! %1$s + + Ne saber mai + + Traduire de + + Traduire en + + Pas ara + + Acabat + + Traduire + + Tornar ensajar + + Traduccions + + Traduccion en cors + + + I a agut un problèma al moment de traduire. Ensajatz tornamai. + + Cargament impossible de las lengas. Mercés de verificar la connexion Internet puèi tornar ensajar. + + Desolat, prenèm pas encara en carga aquesta lenga : %1$s. + + Ne saber mai + + + + Opcions de traduccion + + Totjorn prepausar de traduire + + Totjorn traduire las paginas en %1$s + + Traduire pas jamai las paginas en %1$s + + Traduire pas jamai aqueste site + + Paramètres de traduccion + + + A prepaus de las traduccions dins %1$s + + + + Traduccions + + Prepausar de traduire quand es possible + + Totjorn telecargar las lengas en mòde estalvi de donadas + + Preferéncias de traduccion + + Traduccion automatica + + + Traduire pas jamai aquestes sites + + Telecargar de lengas + + + + Traduccion automatica + + + Seleccionatz una lenga per gerir las preferéncias « Totjorn traduire » e « Traduire pas jamai ». + + + + Prepausar de traduire (per defaut) + + %1$s prepausarà de traduire los sites dins aquesta lenga. + + Totjorn traduire + + %1$s traduirà automaticament aquesta lenga al cargament de la pagina. + + Traduire pas jamai + + + %1$s prepausarà pas jamai de traduire los sites dins aquesta lenga. + + + + Traduire pas jamai aquestes sites + + Per apondre un site novèl : consultatz-lo e seleccionatz « Traduire pas jamai aqueste site » dins lo menú de las traduccions. + + Suprimir %1$s + + Suprimir %1$s ? + + Suprimir + + Anullar + + + + Telecargar de lengas + + Telecargatz de lengas complètas per aver de traduccions mai rapidas e fòra linha. %1$s + + Ne saber mai + + Lengas disponiblas + + requesit + + %1$s (%2$s) + + Telecargar de lengas + + Totas las lengas + + Suprimir + + En cors + + Telecargar + + Seleccionats + + + Suprimir %1$s (%2$s) ? + + Se suprimissètz aquesta lenga, %1$s la telecargarà parcialament dins vòstre cache a cada traduccion. + + Suprimir totas las lengas (%1$s) ? + + Se suprimissètz totas aquestas lengas, %1$s las telecargarà parcialament dins vòstre cache a cada traduccion. + + Suprimir + + Anullar + + + Telecargar en mòde estalvi de donadas (%1$s) ? + + Telecargam parcialament de lengas dins vòstre cache per que las traduccions demòren privadas. + + Totjorn telecargar en mòde estalvi de donadas + + Telecargar + + Telecargar e traduire + + Anullar + + + + Aisinas de desbugatge + + Tornar + + Aisinas d’onglet + + Nombre d’onglets + + Actius + + Inactius + + Privats + + Total + + Aisina de creacion d’onglet + + Nombre d’onglets de crear + + Apondre als onglets actius + + Apondre als onglets inactius + + Apondre als onglets privats diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml index ec3c9216e018..b5bbc9c5c8d4 100644 --- a/app/src/main/res/values-pa-rIN/strings.xml +++ b/app/src/main/res/values-pa-rIN/strings.xml @@ -73,11 +73,6 @@ ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ ਕੋਈ ਪੈੜ੍ਹਾਂ ਨਾ ਛੱਡੋ - - ਜਦੋਂ ਵੀ ਆਪਣੀਆਂ ਪ੍ਰਾਈਵੇਟ ਵਿੰਡੋਆਂ ਨੂੰ ਬੰਦ ਕਰਦੇ ਹੋ ਤਾਂ %1$s ਤੁਹਾਡੇ ਕੂਕੀਜ਼, ਅਤੀਤ ਅਤੇ ਸਾਈਟ ਡਾਟੇ ਨੂੰ ਹਟਾ ਦਿੰਦਾ ਹੈ। %2$s ਸਫ਼ੇ ‘ਚ ਲੱਭੋ + + ਸਫ਼ੇ ਦਾ ਉਲੱਥਾ ਕਰੋ ਭੰਡਾਰ ‘ਚ ਸੰਭਾਲੋ @@ -337,14 +334,8 @@ ਹੁਣੇ ਨਹੀਂ - - Firefox ਨੂੰ ਆਪਣਾ ਪੱਕਾ ਬਰਾਊਜ਼ਰ ਬਣਾਓ ਅਸੀਂ ਤੁਹਾਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹਾਂ - - Firefox ਫ਼ਾਇਦੇ ਨਾਲੋਂ ਲੋਕਾਂ ਨੂੰ ਪਹਿਲ ਦਿੰਦਾ ਹੈ ਅਤੇ ਅੰਤਰ-ਸਾਈਟ ਟਰੈਕਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾ ਕੇ ਤੁਹਾਡੇ ਪਰਦੇਦਾਰੀ ਨੂੰ ਬਚਾਉਂਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਸਾਡੀ ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ ਨੂੰ ਪੜ੍ਹੋ। ਸਾਡਾ ਗ਼ੈਰ-ਮੁਨਾਫ਼ਾ ਸਮਰੱਥ ਬਰਾਊਜ਼ਰ ਕੰਪਨੀਆਂ ਨੂੰ ਵੈੱਬ ਉੱਤੇ ਚੋਰੀ ਛਿਪੇ ਪਿੱਛਾ ਕਰਨ ਤੋਂ ਰੋਕਣ ਲਈ ਮਦਦ ਕਰਦਾ ਹੈ।\n\nਸਾਡੇ ਪਰਦੇਦਾਰੀ ਨੋਟਿਸ ਬਾਰੇ ਹੋਰ ਸਿੱਖੋ। ਹੁਣੇ ਨਹੀਂ - ਫ਼ੋਨ ਤੋਂ ਲੈਪਟਾਪ ਉੱਤੇ ਜਾਓ ਤੇ ਵਾਪਸ ਆਓ - ਜਦੋਂ ਤੁਸੀਂ ਡਿਵਾਈਸਾਂ ਵਿਚਾਲੇ ਤਬਾਦਲਾ ਕਰੋ ਤਾਂ ਇੰਕ੍ਰਿਪਟ ਰਹੋ - - ਆਪਣੇ ਹੋਰ ਡਿਵਾਈਸਾਂ ਉੱਤੇ ਜਿੱਥੇ ਤੁਸੀਂ ਟੈਬਾਂ ਤੇ ਪਾਸਵਰਡਾਂ ਨੂੰ ਜਿੱਥੇ ਛੱਡਿਆ ਸੀ, ਓਥੋਂ ਹੀ ਲਵੋ। ਜਦੋਂ ਤੁਸੀਂ ਸਾਈਨ ਇਨ ਅਤੇ ਸਿੰਕ ਕਰਦੇ ਹੋ ਤਾਂ ਤੁਸੀਂ ਵੱਧ ਸੁਰੱਖਿਅਤ ਹੁੰਦੇ ਹੋ। Firefox ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ, ਬੁੱਕਮਾਰਕਾਂ ਤੇ ਹੋਰਾਂ ਨੂੰ ਇੰਕ੍ਰਿਪਟ ਕਰਦਾ ਹੈ। @@ -368,15 +355,9 @@ ਹੁਣੇ ਨਹੀਂ - - ਨੋਟੀਫ਼ਿਕੇਸ਼ਨ ਤੁਹਾਨੂੰ Firefox ਨਾਲ ਵੱਧ ਕੰਮ ਦੀ ਮਦਦ ਕਰਦੇ ਹਨ ਨੋਟੀਫ਼ਿਕੇਸ਼ਨ Firefox ਨਾਲ ਤੁਹਾਨੂੰ ਸੁਰੱਖਿਅਤ ਰਹਿਣ ਲਈ ਮਦਦ ਕਰਦੇ ਹਨ - - ਟੈਬਾਂ ਨੂੰ ਡਿਵਾਈਸਾਂ ਵਿਚਾਲੇ ਭੇਜੋ, ਡਾਊਨਲੋਡ ਦਾ ਇੰਤਜ਼ਾਮ ਕਰੋ ਅਤੇ Firefox ਦਾ ਪੂਰਾ ਫ਼ਾਇਦਾ ਲੈਣ ਲਈ ਸੁਝਾਅ ਲਵੋ। ਟੈਬਾਂ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੂਪ ਵਿੱਚ ਆਪਣੇ ਡਿਵਾਈਸਾਂ ਉੱਤੇ ਭੇਜੋ ਅਤੇ Firefox ਵਿੱਚ ਹੋਰ ਪਰਦੇਦਾਰੀ ਫ਼ੀਚਰ ਬਾਰੇ ਜਾਣੋ। @@ -418,8 +399,6 @@ ਇੱਕ ਚੁਣੋ - ਖੋਜ ਸ਼ਾਰਟਕੱਟਾਂ ਦਾ ਇੰਤਜ਼ਾਮ ਕਰੋ - ਬਦਲਵੇਂ ਖੋਜ ਇੰਜਣਾਂ ਦਾ ਇੰਤਜ਼ਾਮ ਕਰੋ ਖੋਜ ਮੇਨੂ ਵਿੱਚ ਦਿਸਣ ਵਾਲੇ ਇੰਜਣਾਂ ਨੂੰ ਸੋਧੋ @@ -433,8 +412,6 @@ ਖੋਜ ਇੰਜਣ ਖੋਜ ਇੰਜਣਾਂ ਤੋਂ ਸੁਝਾਅ - - ਸਿਰਨਾਵਾਂ ਪੱਟੀ ਸਿਰਨਾਵਾਂ ਪੱਟੀ ਲਈ ਪਸੰਦਾਂ @@ -559,14 +536,10 @@ ਪਰ ਇਹ ਵੀ ਸੰਭਵ ਹੈ ਕਿ ਹਮਲਾਵਰ ਸ਼ਾਮਲ ਹੋਵੇ। ਜੇ ਤੁਸੀਂ ਵੈੱਬਸਾਈਟ ਨਾਲ ਜਾਰੀ ਰੱਖਣਾ ਹੈ ਤਾਂ ਤੁਹਾਨੂੰ ਕੋਈ ਵੀ ਸੰਵੇਦਨਸ਼ੀਲ ਜਾਣਕਾਰੀ ਨਹੀਂ ਭਰਨੀ ਚਾਹੀਦੀ ਹੈ। ਜੇ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਹੈ ਤਾਂ ਇਸ ਸਾਈਟ ਲਈ ਸਿਰਫ਼-HTTPS ਮੋਡ ਨੂੰ ਆਰਜ਼ੀ ਤੌਰ ਉੱਤੇ ਬੰਦ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਅਸੈਸਬਿਲਟੀ - - ਕਸਟਮ ਫਾਇਰਫਾਕਸ ਖਾਤਾ ਸਰਵਰ ਪਸੰਦੀਦਾ Mozilla ਖਾਤਾ ਸਰਵਰ ਪਸੰਦੀਦਾ ਸਿੰਕ ਸਰਵਰ - - Firefox ਖਾਤਾ/ਸਿੰਕ ਸਰਵਰ ਸੋਧਿਆ ਗਿਆ ਹੈ। ਤਬਦੀਲੀਆਂ ਲਾਗੂ ਕਰਨ ਲਈ ਐਪਲੀਕੇਸ਼ਨ ਤੋਂ ਬਾਹਰ ਜਾਓ… Mozilla ਖਾਤਾ/ਸਿੰਕ ਸਰਵਰ ਨੂੰ ਸੋਧਿਆ ਗਿਆ ਹੈ। ਤਬਦੀਲੀਆਂ ਲਾਗੂ ਕਰਨ ਵਾਸਤੇ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ… @@ -585,8 +558,6 @@ ਟੈਬਾਂ, ਬੁੱਕਮਾਰਕਾਂ, ਪਾਸਵਰਡਾ ਤੇ ਹੋਰਾਂ ਨੂੰ ਸਿੰਕ ਕਰਨ ਲਈ ਸਾਈਨ ਇਨ ਕਰੋ। - ਫਾਇਰਫਾਕਸ ਖਾਤਾ - Mozilla ਖਾਤਾ ਸਿੰਕ ਕਰਨ ਨੂੰ ਬਹਾਲ ਕਰਨ ਲਈ ਮੁੜ-ਕਨੈਕਟ ਕਰੋ @@ -598,8 +569,6 @@ ਡਾਟਾ ਭੰਡਾਰ USB ਰਾਹੀਂ ਰਿਮੋਟ ਡੀਬੱਗ ਕਰਨਾ - - ਖੋਜ ਇੰਜਣ ਵੇਖੋ ਖੋਜ ਸੁਝਾਅ ਵੇਖਾਓ @@ -733,12 +702,6 @@ ਐਡ-ਆਨ ਬਾਰੇ ਜਾਣੋ - - - ਐਡ-ਆਨ ਸਹਾਇਕ ਨਹੀਂ ਹੈ - - ਐਡ-ਆਨ ਪਹਿਲਾਂ ਹੀ ਇੰਸਟਾਲ ਹੈ - ਐਡ-ਆਨ ਆਰਜ਼ੀ ਤੌਰ ਉੱਤੇ ਅਸਮਰੱਥ ਹਨ @@ -798,7 +761,7 @@ ਮਿਲੀਆਂ ਟੈਬਾਂ - ਹੋਰ ਫਾਇਰਫਾਕਸ ਡਿਵਾਈਸਾਂ ਤੋਂ ਮਿਲੀਆਂ ਟੈਬਾਂ ਲਈ ਸੂਚਨਾਵਾਂ ਹਨ। + ਹੋਰ Firefox ਡਿਵਾਈਸਾਂ ਤੋਂ ਮਿਲੀਆਂ ਟੈਬਾਂ ਲਈ ਸੂਚਨਾਵਾਂ ਹਨ। ਟੈਬ ਮਿਲੀ @@ -1363,7 +1326,7 @@ ਹੋਰ ਡਿਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕਰੋ - ਟੈਬ ਭੇਜਣ ਲਈ, ਘੱਟੋ-ਘੱਟ ਹੋਰ ਡਿਵਾਈਸ ‘ਤੇ ਫਾਇਰਫਾਕਸ ਵਿੱਚ ਸਾਈਨ ਇਨ ਕਰੋ। + ਟੈਬ ਭੇਜਣ ਲਈ, ਘੱਟੋ-ਘੱਟ ਹੋਰ ਡਿਵਾਈਸ ਉੱਤੇ Firefox ਵਿੱਚ ਸਾਈਨ ਇਨ ਕਰੋ। ਸਮਝ ਗਏ @@ -1381,6 +1344,11 @@ ਨਿੱਜੀ ਟੈਬਾਂ ਬੰਦ ਕਰੋ + + + ਪ੍ਰਾਈਵੇਟ ਟੈਬਾਂ ਨੂੰ ਬੰਦ ਕਰਨਾ ਹੈ? + ਪ੍ਰਾਈਵੇਟ ਟੈਬਾਂ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਇਸ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨੂੰ ਛੂਹੋ ਜਾਂ ਸਵਾਈਪ ਕਰੋ। + ਮਾਰਕੀਟਿੰਗ @@ -1561,7 +1529,7 @@ ਕੋਡ ਸਕੈਨ ਕਰੋ - https://firefox.com/pair ‘ਤੇ ਜਾਓ]]> + https://firefox.com/pair ‘ਤੇ ਜਾਓ]]> ਸਕੈਨ ਕਰਨ ਲਈ ਤਿਆਰ @@ -1621,6 +1589,8 @@ ਸਾਰੇ ਕੂਕੀਜ਼ (ਵੈੱਬਸਾਈਟਾਂ ਦੇ ਕੰਮ ਨਾ ਕਰਨ ਦਾ ਕਾਰਨ ਹੋਵੇਗਾ) ਅੰਤਰ-ਸਾਈਟ ਕੂਕੀਜ਼ ਨਿਖੇੜੋ + + ਵੈੱਬਸਾਈਟਾਂ ਨੂੰ ਡਾਟਾ ਵੇਚਣ ਜਾਂ ਸਾਂਝਾ ਨਾ ਕਰਨ ਲਈ ਹਦਾਇਤ ਦਿਓ ਟਰੈਕਿੰਗ ਸਮੱਗਰੀ @@ -1746,7 +1716,7 @@ %1$s ਵਿੱਚ ਆਪੇ ਭਰੋ - %1$s ਵਰਤਣ ਦੌਰਾਨ ਵੈਬਸਾਈਟਾਂ ਵਿੱਚ ਵਰਤੋੰਕਾਰ-ਨਾਂ ਅਤੇ ਪਾਸਵਰਡ ਭਰੋ ਤੇ ਸੰਭਾਲੋ| + %1$s ਨੂੰ ਵਰਤਣ ਦੌਰਾਨ ਵੈਬਸਾਈਟਾਂ ਵਿੱਚ ਵਰਤੋਂਕਾਰ-ਨਾਂ ਅਤੇ ਪਾਸਵਰਡ ਭਰੋ ਅਤੇ ਸੰਭਾਲੋ। ਹੋਰ ਐਪਾਂ ਵਿੱਚ ਆਪੇ ਭਰੋ @@ -1958,28 +1928,18 @@ ਨਵਾਂ ਖੋਜ ਇੰਜਣ ਜੋੜੋ ਖੋਜ ਇੰਜਣ ਸੋਧੋ - - ਜੋੜੋ - - ਸੰਭਾਲੋ ਸੋਧੋ ਹਟਾਓ - - ਹੋਰ ਨਾਂ - - ਨਾਂ ਖੋਜ ਇੰਜਣ ਦਾ ਨਾਂ ਖੋਜ ਸਤਰ URL - ਵਰਤਣ ਲਈ ਖੋਜ ਸਤਰ - ਖੋਜਣ ਲਈ URL “%s” ਨਾਲ ਕਿਊਰੀ ਨੂੰ ਤਬਦੀਲ ਕਰੋ। ਮਿਸਾਲ ਵਜੋਂ:\nhttps://www.google.com/search?q=%s @@ -2098,7 +2058,7 @@ ਟੈਬ ਨੂੰ ਸਿੰਕ ਕਰਨਾ ਸਮਰੱਥ ਕਰੋ। - ਤੁਹਾਡੇ ਹੋਰ ਡਿਵਾਈਸ ਉੱਤੇ ਫਾਇਰਫਾਕਸ ਵਿੱਚ ਕੋਈ ਵੀ ਖੋਲ੍ਹੀ ਹੋਈ ਟੈਬ ਨਹੀਂ ਹੈ। + ਤੁਹਾਡੇ ਹੋਰ ਡਿਵਾਈਸ ਉੱਤੇ Firefox ਵਿੱਚ ਕੋਈ ਵੀ ਖੋਲ੍ਹੀ ਹੋਈ ਟੈਬ ਨਹੀਂ ਹੈ। ਤੁਹਾਡੇ ਹੋਰ ਡਿਵਾਈਸਾਂ ਤੋਂ ਟੈਬਾਂ ਦੀ ਸੂਚੀ ਵੇਖੋ। @@ -2208,8 +2168,6 @@ - ਰੀਵਿਊ ਚੈਕਰ - ਰੀਵਿਊ ਚੈਕਰ ਭਰੋਸੇਯੋਗ ਰੀਵਿਊ @@ -2222,8 +2180,10 @@ ਅਡਜੱਸਟ ਕੀਤੀ ਰੇਟਿੰਗ - ਗ਼ੈਰ-ਭਰੋਸੇਯੋਗ ਰੀਵਿਊ ਹਟਾਏ + ਗ਼ੈਰ-ਭਰੋਸੇਯੋਗ ਰੀਵਿਊ ਹਟਾਏ + + ਭਰੋਸੇਯੋਗ ਰੀਵਿਊਆਂ ਉੱਤੇ ਅਧਾਰਿਤ ਸੱਜਰੇ ਰੀਵਿਊ ਤੋਂ ਹਾਈਲਾਈਟ @@ -2234,14 +2194,10 @@ ਅੱਖਰ ਅਧਾਰਿਤ ਦਰਜਾ ਦਿੱਤਾ ਹੈ।]]> ਭਰੋਸੇਯੋਗ ਰੀਵਿਊ। ਅਸੀਂ ਮੰਨਦੇ ਹਾਂ ਕਿ ਰੀਵਿਊ ਅਸਲ ਗਾਹਕ ਵਲੋਂ ਹਨ, ਜਿਸ ਨੇ ਇਮਾਨਦਾਰੀ ਨਾਲ ਨਿਰਪੱਖ ਰੀਵਿਊ ਦਿੱਤੇ ਹਨ। - - ਸਾਨੂੰ ਲੱਗਦਾ ਹੈ ਰੀਵਿਊ ਭਰੋਸੇਯੋਗ ਹਨ। ਅਸੀਂ ਮੰਨਦੇ ਹਾਂ ਕਿ ਭਰੋਸੇਯੋਗ ਅਤੇ ਗ਼ੈਰ-ਭਰੋਸੇਯੋਗ ਰੀਵਿਊ ਰਲਵੇਂ ਰੂਪ ਵਿੱਚ ਹੁੰਦੇ ਹਨ। ਗ਼ੈਰਭਰੋਸੇਯੋਗ ਰੀਵਿਊ। ਅਸੀਂ ਮੰਨਦੇ ਹਾਂ ਕਿ ਰੀਵਿਊ ਨਕਲੀ, ਫ਼ਰਜ਼ੀ ਹੋਣ ਜਾਂ ਪੱਖਪਾਤੀ ਰੀਵਿਊ ਦੇਣ ਵਾਲਿਆਂ ਵਲੋਂ ਹੋਣ ਸਕਦੇ ਹਨ। - - ਸਾਨੂੰ ਲੱਗਦਾ ਹੈ ਰੀਵਿਊ ਭਰੋਸੇਯੋਗ ਨਹੀਂ ਹਨ। ਅਡਜੱਸਟ ਕੀਤੀ ਰੇਟਿੰਗ ਸਾਡੇ ਵਲੋਂ ਸਿਰਫ਼ ਭਰੋਸੇਯੋਗ ਮੰਨੇ ਗਏ ਰੀਵਿਊ ਦੇ ਆਧਾਰ ਉੱਤੇ ਹੈ।]]> @@ -2257,8 +2213,6 @@ ਰੀਵਿਊ ਚੈਕਰ ਵਿੱਚ ਇਸ਼ਤਿਹਾਰ ਵੇਖਾਓ - ਤੁਸੀਂ ਕਦੇ-ਕਦਾਈ ਸੰਬੰਧਿਤ ਉਤਪਾਦਾਂ ਦੇ ਇਸ਼ਤਿਹਾਰ ਵੇਖੋਗੇ। ਸਾਰੇ ਇਸ਼ਤਿਹਾਰ ਸਾਡੇ ਰੀਵਿਊ ਕੁਆਲਟੀ ਮਿਆਰਾਂ ਤੇ ਖਰ੍ਹੇ ਉਤਰਨੇ ਚਾਹੀਦੇ ਹਨ। %s - ਤੁਸੀਂ ਢੁੱਕਵੇਂ ਉਤਪਾਦਾਂ ਲਈ ਕਦੇ ਕਦਾਈ ਇਸ਼ਤਿਹਾਰ ਵੇਖੋਗੇ। ਅਸੀਂ ਭਰੋਸੇਯੋਗ ਉਤਪਾਦਾਂ ਲਈ ਹੀ ਇਸ਼ਤਿਹਾਰ ਦੇਵਾਂਗੇ। %s ਹੋਰ ਜਾਣੋ @@ -2281,23 +2235,23 @@ ਜਦੋਂ ਉਪਤਾਦ ਲਈ ਹੋਰ ਰੀਵਿਊ ਹੁੰਦੇ ਹਨ ਤਾਂ ਅਸੀਂ ਉਹਨਾਂ ਦੀ ਕੁਆਲਟੀ ਚੈਕ ਕਰ ਸਕਦੇ ਹਾਂ। - ਉਤਪਾਦ ਮੌਜੂਦ ਨਹੀਂ ਹੈ + ਉਤਪਾਦ ਮੌਜੂਦ ਨਹੀਂ ਹੈ - ਜੇ ਤੁਹਾਨੂੰ ਉਹ ਉਤਪਾਦ ਵਾਪਸ ਸਟਾਕ ਵਿੱਚ ਮਿਲੇ ਤਾਂ ਸਾਨੂੰ ਇਸ ਬਾਰੇ ਦੱਸਿਓ ਅਤੇ ਅਸੀਂ ਰੀਵਿਊ ਦੀ ਜਾਂਚ ਕਰਾਂਗੇ। + ਜੇ ਤੁਹਾਨੂੰ ਉਹ ਉਤਪਾਦ ਵਾਪਸ ਸਟਾਕ ਵਿੱਚ ਮਿਲੇ ਤਾਂ ਸਾਨੂੰ ਇਸ ਬਾਰੇ ਦੱਸਿਓ ਅਤੇ ਅਸੀਂ ਰੀਵਿਊ ਦੀ ਜਾਂਚ ਕਰਾਂਗੇ। - ਇਸ ਉਤਪਾਦ ਦੇ ਸਟਾਕ ਵਿੱਚ ਵਾਪਸ ਹੋਣ ਦੀ ਜਾਣਕਾਰੀ ਦਿਓ - - ਉਤਪਾਦ ਸਟਾਕ ਵਿੱਚ ਹੋਣ ਦੀ ਰਿਪੋਰਟ ਕਰੋ + ਉਤਪਾਦ ਸਟਾਕ ਵਿੱਚ ਹੋਣ ਦੀ ਰਿਪੋਰਟ ਕਰੋ - ਰੀਵਿਊ ਕੁਆਲਟੀ ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ + ਰੀਵਿਊ ਕੁਆਲਟੀ ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ - ਰੀਵਿਊ ਕੁਆਲਟੀ ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ + ਰੀਵਿਊ ਕੁਆਲਟੀ ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ + + ਰੀਵਿਊ ਕੁਆਲਟੀ ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ (%s) ਇਸ ਨੂੰ ਲਗਭਗ 60 ਸਕਿੰਟ ਲੱਗ ਸਕਦੇ ਹਨ। - ਜਾਣਕਾਰੀ ਦੇਣ ਲਈ ਧੰਨਵਾਦ! + ਜਾਣਕਾਰੀ ਦੇਣ ਲਈ ਧੰਨਵਾਦ! - ਸਾਡੇ ਕੋਲ ਇਸ ਉਤਪਾਦ ਦੇ ਰੀਵਿਊ 24 ਘੰਟਿਆਂ ਵਿੱਚ ਅੱਪਡੇਟ ਹੋਣੇ ਚਾਹੀਦੇ ਹਨ। ਬਾਅਦ ਵਿੱਚ ਵੇਖਿਓ। + ਸਾਡੇ ਕੋਲ ਇਸ ਉਤਪਾਦ ਦੇ ਰੀਵਿਊ 24 ਘੰਟਿਆਂ ਵਿੱਚ ਅੱਪਡੇਟ ਹੋਣੇ ਚਾਹੀਦੇ ਹਨ। ਬਾਅਦ ਵਿੱਚ ਵੇਖਿਓ। ਅਸੀਂ ਇਹ ਰੀਵਿਊਆਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਦੇ ਹਾਂ @@ -2335,17 +2289,17 @@ ਹੋਰ ਜਾਣੋ - “ਹਾਂ, ਇਸ ਨੂੰ ਅਜ਼ਮਾਓ” ਚੁਣ ਕੇ ਤੁਸੀਂ Mozilla ਵਲੋਂ %1$s ਦੀ %2$s ਅਤੇ %3$s ਲਈ ਸਹਿਮਤ ਹੁੰਦੇ ਹੋ। + “ਹਾਂ, ਇਸ ਨੂੰ ਅਜ਼ਮਾਓ” ਚੁਣ ਕੇ ਤੁਸੀਂ Mozilla ਵਲੋਂ %1$s ਦੀ %2$s ਅਤੇ %3$s ਲਈ ਸਹਿਮਤ ਹੁੰਦੇ ਹੋ। - “ਹਾਂ, ਇਸ ਨੂੰ ਅਜ਼ਮਾਓ” ਨੂੰ ਚੁਣ ਕੇ ਤੁਸੀਂ %1$s ਤੋਂ ਹੇਠ ਦਿੱਤਿਆਂ ਨਾਲ ਸਹਿਮਤ ਹੁੰਦੇ ਹੋ: + “ਹਾਂ, ਇਸ ਨੂੰ ਅਜ਼ਮਾਓ” ਨੂੰ ਚੁਣ ਕੇ ਤੁਸੀਂ %1$s ਤੋਂ ਹੇਠ ਦਿੱਤਿਆਂ ਨਾਲ ਸਹਿਮਤ ਹੁੰਦੇ ਹੋ: - ਪਰਦੇਦਾਰੀ ਨੀਤੀ + ਪਰਦੇਦਾਰੀ ਨੀਤੀ - ਪਰਦੇਦਾਰੀ ਨੀਤੀ + ਪਰਦੇਦਾਰੀ ਨੀਤੀ - ਵਰਤਣ ਲਈ ਸ਼ਰਤਾਂ + ਵਰਤਣ ਲਈ ਸ਼ਰਤਾਂ - ਵਰਤਣ ਦੀ ਸ਼ਰਤਾਂ + ਵਰਤਣ ਦੀ ਸ਼ਰਤਾਂ ਹਾਂ, ਇਸ ਨੂੰ ਅਜ਼ਮਾਓ @@ -2382,6 +2336,9 @@ ਮੁਕਾਬਲੇਬਾਜ਼ੀ + + “%s” + ਸਮੇਟੋ @@ -2399,4 +2356,205 @@ ਹੋਰ ਜਾਣਨ ਲਈ ਲਿੰਕ ਨੂੰ ਖੋਲ੍ਹੋ %s, ਹੈਡਿੰਗ + + + ਲਿੰਕ + + ਲਿੰਕ ਮੌਜੂਦ ਹਨ + + + + + + ਇਹ ਸਫ਼ੇ ਦਾ ਉਲੱਥਾ ਕਰਨਾ ਹੈ? + + %1$s ਵਿੱਚ ਪ੍ਰਾਈਵੇਟ ਉਲੱਥਾ ਅਜ਼ਮਾਓ + + ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ ਲਈ ਉਲੱਥਾ ਕਦੇ ਵੀ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਤੋਂ ਬਾਹਰ ਨਹੀਂ ਜਾਂਦਾ ਹੈ। ਨਵੀਆਂ ਭਾਸ਼ਾਵਾਂ ਅਤੇ ਸੁਧਾਰ ਛੇਤੀ ਆ ਰਹੇ ਹਨ! %1$s + + ਹੋਰ ਜਾਣੋ + + ਇਸ ਤੋਂ ਉਲੱਥਾ ਕਰੋ + + ਇਸ ਵਿੱਚ ਉਲੱਥਾ ਕਰੋ + + ਹਾਲੇ ਨਹੀਂ + + ਮੁਕੰਮਲ + + ਉਲੱਥਾ ਕਰੋ + + ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ + + ਉਲੱਥਾ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ + + ਉਲੱਥਾ ਜਾਰੀ ਹੈ + + + ਅਨੁਵਾਦ ਕਰਨ ਦੌਰਾਨ ਸਮੱਸਿਆ ਆਈ ਸੀ। ਬਾਅਦ ਵਿੱਚ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ। + + ਭਾਸ਼ਾਵਾਂ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਆਪਣੇ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰਕੇ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ। + + ਅਫ਼ਸੋਸ ਅਸੀਂ ਹਾਲੇ %1$s ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹਾਂ। + + ਹੋਰ ਜਾਣੋ + + + + ਉਲੱਥੇ ਲਈ ਚੋਣਾਂ + + ਹਮੇਸ਼ਾਂ ਉਲੱਥਾ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰੋ + + ਹਮੇਸ਼ਾਂ %1$s ਲਈ ਉਲੱਥਾ ਕਰੋ + + %1$s ਲਈ ਕਦੇ ਉਲੱਥਾ ਨਾ ਕਰੋ + + ਇਹ ਸਾਈਟ ਦਾ ਉਲੱਥਾ ਕਦੇ ਨਾ ਕਰੋ + + ਉਲੱਥਾ ਸੈਟਿੰਗਾਂ + + %1$s ਵਿੱਚ ਉਲੱਥਾ ਬਾਰੇ + + + + ਉਲੱਥੇ + + ਜਦੋਂ ਵੀ ਸੰਭਵ ਹੋਵੇ ਤਾਂ ਉਲੱਥੇ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰੋ + + ਡਾਟਾ ਬਚਾਉਣ ਢੰਗ ਵਿੱਚ ਹਮੇਸ਼ਾਂ ਉਲੱਥਾ ਭਾਸ਼ਾਵਾਂ ਡਾਊਨਲੋਡ ਕਰੋ + + ਉਲੱਥਾ ਪਸੰਦਾਂ + + ਆਪਣੇ-ਆਪ ਉਲੱਥਾ + + ਇਹ ਸਾਈਟਾਂ ਲਈ ਕਦੇ ਉਲੱਥਾ ਨਾ ਕਰੋ + + ਭਾਸ਼ਾਵਾਂ ਨੂੰ ਡਾਊਨਲੋਡ ਕਰੋ + + + + ਆਪਣੇ-ਆਪ ਉਲੱਥਾ + + ”ਹਮੇਸ਼ਾ ਟਰਾਂਸਲੇਟ ਕਰੋ“ ਅਤੇ "ਕਦੇ ਟਰਾਂਸਲੇਟ ਨਾ ਕਰੋ" ਪਸੰਦਾਂ ਦਾ ਇੰਤਜ਼ਾਮ ਕਰਨ ਲਈ ਭਾਸ਼ਾ ਚੁਣੋ। + + + + ਟਰਾਂਸਲੇਸ਼ਨ ਲਈ ਪੇਸ਼ਕਸ਼ ਕਰੋ (ਮੂਲ) + + %1$s ਇਸ ਭਾਸ਼ਾ ਵਿੱਚ ਸਾਈਟਾਂ ਦੇ ਟਰਾਂਸਲੇਸ਼ਨ ਕਰਨ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰੇਗਾ। + + ਹਮੇਸ਼ਾਂ ਟਰਾਂਸਲੇਟ ਕਰੋ + + ਜਦੋਂ ਵੀ ਸਫ਼ਾ ਲੋਡ ਹੋਵੇਗਾ ਤਾਂ %1$s ਇਸ ਭਾਸ਼ਾ ਵਿੱਚ ਆਪਣੇ-ਆਪ ਟਰਾਂਸਲੇਟ ਕਰੇਗਾ। + + ਕਦੇ ਟਰਾਂਸਲੇਟ ਨਾ ਕਰੋ + + %1$s ਇਸ ਭਾਸ਼ਾ ਵਿੱਚ ਸਾਈਟਾਂ ਦੇ ਟਰਾਂਸਲੇਸ਼ਨ ਕਰਨ ਦੀ ਕਦੇ ਵੀ ਪੇਸ਼ਕਸ਼ ਨਹੀਂ ਕਰੇਗਾ। + + + + ਇਹ ਸਾਈਟਾਂ ਲਈ ਕਦੇ ਟਰਾਂਸਲੇਸ਼ਨ ਨਾ ਕਰੋ + + ਨਵੀਂ ਸਾਈਟ ਜੋੜਨ ਲਈ: ਇਸ ਨੂੰ ਖੋਲ੍ਹੋ ਅਤੇ ਟਰਾਂਸਲੇਸ਼ਨ ਮੇਨੂ ਤੋਂ “ਇਸ ਸਾਈਟ ਨੂੰ ਕਦੇ ਟਰਾਂਸਲੇਟ ਨਾ ਕਰੋ” ਚੁਣੋ। + + %1$s ਨੂੰ ਹਟਾਓ + + %1$s ਨੂੰ ਹਟਾਉਣਾ ਹੈ? + + + ਹਟਾਓ + + ਰੱਦ ਕਰੋ + + + + ਭਾਸ਼ਾਵਾਂ ਡਾਊਨਲੋਡ ਕਰੋ + + ਤੇਜ਼ ਅਤੇ ਆਫਲਾਈਨ ਟਰਾਂਸਲੇਸ਼ਨ ਕਰਨ ਲਈ ਪੂਰੀਆਂ ਭਾਸ਼ਾਵਾਂ ਡਾਊਨਲੋਡ ਕਰੋ। %1$s + + ਹੋਰ ਜਾਣੋ + + ਮੌਜੂਦ ਭਾਸ਼ਾਵਾਂ + + ਲੋੜੀਂਦਾ + + %1$s (%2$s) + + ਭਾਸ਼ਾਵਾਂ ਡਾਊਨਲੋਡ ਕਰੋ + + ਸਭ ਭਾਸ਼ਾਵਾਂ + + ਹਟਾਓ + + ਜਾਰੀ ਹੈ + + ਡਾਊਨਲੋਡ + + ਚੁਣੀ + + + %1$s (%2$s) ਨੂੰ ਹਟਾਉਣਾ ਹੈ? + + ਜੇ ਤੁਸੀਂ ਇਹ ਭਾਸ਼ਾ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਤਾਂ ਜਦ ਵੀ ਤੁਸੀਂ ਉਲੱਥਾ ਕਰੋਗੇ ਤਾਂ %1$s ਤੁਹਾਡੀ ਕੈਸ਼ ਲਈ ਅਧੂਰੀ ਭਾਸ਼ਾ ਡਾਊਨਲੋਡ ਕਰੇਗਾ। + + ਕੀ ਸਾਰੀਆਂ ਭਾਸ਼ਾਵਾਂ (%1$s) ਹਟਾਉਣੀਆਂ ਹਨ? + + ਜੇ ਤੁਸੀਂ ਸਾਰੀਆਂ ਭਾਸ਼ਾਵਾਂ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਤਾਂ ਜਦ ਵੀ ਤੁਸੀਂ ਉਲੱਥਾ ਕਰੋਗੇ ਤਾਂ %1$s ਤੁਹਾਡੀ ਕੈਸ਼ ਲਈ ਅਧੂਰੀਆਂ ਭਾਸ਼ਾਵਾਂ ਡਾਊਨਲੋਡ ਕਰੇਗਾ। + + ਹਟਾਓ + + ਰੱਦ ਕਰੋ + + + ਡਾਟਾ ਬੱਚਤ ਢੰਗ (%1$s) ਵਿੱਚ ਹੋਣ ਦੇ ਦੌਰਾਨ ਡਾਊਨਲੋਡ ਕਰਨਾ ਹੈ? + + + ਅਸੀਂ ਅਧੂਰੀਆਂ ਭਾਸ਼ਾਵਾਂ ਨੂੰ ਤੁਹਾਡੀ ਕੈਸ਼ ਲਈ ਡਾਊਨਲੋਡ ਕਰਦੇ ਹਾਂ ਤਾਂ ਕਿ ਉਲੱਥੇ ਨੂੰ ਪ੍ਰਾਈਵੇਟ ਰੱਖਿਆ ਜਾਵੇ। + + ਡਾਟਾ ਬਚਾਉਣ ਢੰਗ ਵਿੱਚ ਹਮੇਸ਼ਾਂ ਡਾਊਨਲੋਡ ਕਰੋ + + ਡਾਊਨਲੋਡ ਕਰੋ + + ਡਾਊਨਲੋਡ ਅਤੇ ਉਲੱਥਾ ਕਰੋ + + ਰੱਦ ਕਰੋ + + + + ਡੀਬੱਗ ਟੂਲ + + ਪਿੱਛੇ ਜਾਓ + + ਟੈਬ ਟੂਲ + + ਟੈਬ ਗਿਣਤੀ + + ਸਰਗਰਮ + + ਨਾ-ਸਰਗਰਮ + + ਨਿੱਜੀ + + ਕੁੱਲ + + ਟੈਬ ਬਣਾਉਣ ਵਾਲਾ ਟੂਲ + + bਣਾਉਣ ਲਈ ਟੈਬਾਂ ਦੀ ਗਿਣਤੀ + + ਸਰਗਰਮ ਟੈਬਾਂ ਵਿੱਚ ਜੋੜੋ + + ਨਾ-ਸਰਗਰਮ ਟੈਬਾਂ ਵਿੱਚ ਜੋੜੋ + + ਪ੍ਰਾਈਵੇਟ ਟੈਬਾਂ ਵਿੱਚ ਜੋੜੋ diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 56b83e04a773..a77e24283a38 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -66,10 +66,22 @@ نجی ورتوں بارے عام فرضی گلاں + + + ایس ڈوائیس اُتے کوئی پیڑھاں نہ چھڈو + + جدوں وی آپݨیاں نجی ٹیباں نوں بند کردے او تاں %1$s تہاڈے کوکیاں، تاریخ تے سائیٹ ڈیٹے نوں ہٹا دندا اے۔ %2$s + + + میری سرگرمی نوں بھلا کوݨ ویکھ سکدا اے؟ + - اگلی نجی ٹیب نوں اکو ٹھونگے نال چالو کر دیو۔ - آپݨی اگلی نجی ٹیب نوں چھوہ کے چلاؤ۔ مکھ سکرین تے جوڑو @@ -90,6 +102,12 @@ پوری کوکی حفاظت بارے جاݨو + + + + تازہ نجی سیشن شروع کرن لئی اتھے چھوہو۔ آپݨے تاریخ، کوکیاں — ہر چیز ہٹا دیو۔ + + کیمرے لئی پہنچ چاہیدی اے۔ فون دیاں سیٹنگاں تے جاؤ، اجازتاں نوں چھوہو تے اجازت دیݨ دی چوݨ نوں چھوہو۔ @@ -126,6 +144,9 @@ نجی ٹیب کھولھو + + پاس‌ورڈ شارٹ کٹ + واپس جاؤ @@ -179,6 +200,8 @@ لائبریری ڈیسک‌ٹاپ سائٹ + + سادے ٹیب چ کھولھو مکھ سکرین تے جوڑو @@ -187,6 +210,8 @@ مڑ جوڑ کرو صفحے چ لبھو + + صفحے دا اُلتھا کرو بھنڈار چ سنبھالو @@ -220,6 +245,9 @@ مکھ سکرین + + براؤز کرن دی تاریخ مٹاؤ چݨی بولی @@ -232,7 +260,7 @@ سکین کرو - کھوج انجݨ + کھوج انجݨ کھوج انجݨ دیاں ترجیحاں @@ -246,7 +274,7 @@ نجی سشناں وچ کھوجݨ والی تجویز دیو؟ تہاڈے ولوں سرناواں پٹی وچ لکھی ہر چیز نوں %s تہاڈے مول کھوج انجݨ نال سانجھا کرےگا۔ - + %s کھوج @@ -254,10 +282,11 @@ کھوج دیاں سیٹنگاں - ہݨے ایہہ کھوجو – - ہݨے ایہنوں کھوجو – + + %s کھوجݨ انجݨ + تہاڈے آپݨے بݨاۓ مکھ صفحے نوں سمجھو۔ سجریاں ٹیباں، بک‌مارک تے کھوج دے نتیجے ایتھے دکھائی دیݨ‌گے۔ @@ -292,15 +321,38 @@ ہݨے نہیں - - - %s ایپ نوں آپݨا پکا بروزر بݨاؤ + + + اسیں تہانوں سرکھیت رکھݨا چاہندے آں + + ساڈا غیر منافع سمرتھ براؤزر کمپنیاں نوں ویب اُتے چوری بھِپے پِچھا کرن توں روکݨ لئی مدد کردا اے۔ \n\n ساڈے پردے داری نوٹس بارے ہور سکھو۔ - پردے داری دا بیان + پردے داری دا بیان + + مول براؤزر تے طور تے بݨاؤ + + ہݨے نہیں + + + جدوں تسیں ڈوائیساں وچالے تبادلا کرو تاں انکرپٹ رہو + + جدوں تسیں سائین ان تے سِنک کردے ہو تاں تسیں ودھ سرکھیت ہندے او۔ فائرفاکس تہاڈے پاس‌ورداں، بُک‌مارکاں تے ہورناں نوں انکرپٹ کردا اے۔ + + سائین ان کرو + + ہݨے نہیں + + نوٹیفکیشن فائیرفاکس نال تہانوں سرکھیت رہݨ لئی مدد کردے ہن + + ٹیباں نوں سرکھیت روپ وچ آپݨے ڈوائیساں اُتے بھیجو تے فائرفاکس وچ ہور پردے داری فیچراں بارے جاݨوں۔ + + اطلاع نامے چالو کرو - ہݨے نہیں + ہݨے نہیں کھوج @@ -323,8 +375,6 @@ کھوج - - پتے دی پٹی ایپ دکان تے درجہ دیو - بند + بند - چالو + چالو رد کرو - - اجازت دیو - اجازت دیو + اجازت دیو - - چالو بند @@ -365,8 +411,6 @@ چݨندا کرو جدوں لوگ‌این کیتا ٹیباں، اتے پتے، پاس‌ورڈ تے ہور ملا جا سکدے ہن۔ - - فائرفاکس کھاتہ بولی @@ -491,9 +535,9 @@ %s ٹیب بند کرو - ناں بدلو - - ہٹاؤ + ناں بدلو + + ہٹاؤ %1$s مٹا گیا @@ -574,8 +618,6 @@ کیمرہ مائیکروفون - - چالو بند @@ -658,12 +700,6 @@ مٹاؤ - - لوگ‌این کرو - - - خود بخود - رد کرو @@ -736,20 +772,11 @@ پتہ مٹاؤ - - پتہ پایو - - سانجھا کرو سودھو مٹاؤ - - ہور - - ناں - %1$s مٹا گیا @@ -766,11 +793,11 @@ سودھو - ناں + ناں - ٹھیک اے - - رد کرو + ٹھیک اے + + رد کرو سیٹنگاں @@ -784,4 +811,6 @@ ہور جاݨو + + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index b431879c7654..ff697c01140b 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -70,11 +70,6 @@ Nie zostawiaj śladów na tym urządzeniu - - %1$s usuwa Twoje ciasteczka, historię i dane witryn po zamknięciu wszystkich prywatnych okien. %2$s Znajdź na stronie + + Przetłumacz stronę Zachowaj w kolekcji @@ -331,14 +328,8 @@ Nie teraz - - Używaj przeglądarki Firefox za każdym razem Uwielbiamy zapewniać Ci bezpieczeństwo - - Firefox stawia ludzi ponad zyski i chroni Twoją prywatność, blokując elementy śledzące między witrynami.\n\nWięcej informacji znajdziesz w naszych zasadach ochrony prywatności. Nasza przeglądarka wspierana przez organizację non-profit pomaga powstrzymywać firmy przed potajemnym śledzeniem Cię w Internecie.\n\nWięcej informacji znajdziesz w naszych zasadach ochrony prywatności. Nie teraz - Przełączaj się z telefonu na laptopa i z powrotem - Nie trać szyfrowania podczas przełączania się między urządzeniami - - Otwieraj karty i pobierz hasła z innych urządzeń, aby kontynuować w tym samym miejscu. Zalogowanie i zsynchronizowanie zwiększa Twoje bezpieczeństwo. Firefox szyfruje hasła, zakładki i nie tylko. @@ -362,15 +349,9 @@ Nie teraz - - Powiadomienia pomogą Ci lepiej wykorzystać Firefoksa Powiadomienia pomogą Ci zachować bezpieczeństwo z Firefoksem - - Przesyłaj karty między urządzeniami, zarządzaj pobieranymi plikami i otrzymuj wskazówki, jak najlepiej wykorzystać Firefoksa. Bezpiecznie przesyłaj karty między urządzeniami i odkrywaj inne funkcje chroniące prywatność w Firefoksie. @@ -412,8 +393,6 @@ Wybierz jedną - Skróty wyszukiwania - Zarządzaj alternatywnymi wyszukiwarkami Zmiana wyszukiwarek widocznych w menu wyszukiwania @@ -427,8 +406,6 @@ Wyszukiwarki Podpowiedzi wyszukiwarek - - Pasek adresu Preferencje paska adresu @@ -551,14 +528,10 @@ Możliwe jest również, że atakujący próbuje przechwycić informacje. Jeśli otworzysz tę witrynę, nie powinno się podawać na niej żadnych prywatnych informacji. Tryb używania wyłącznie protokołu HTTPS zostanie dla niej tymczasowo wyłączony. Ułatwienia dostępu - - Własny serwer kont Firefoksa Własny serwer kont Mozilli Własny serwer synchronizacji - - Zmieniono serwer kont Firefoksa/synchronizacji. Wyłączanie aplikacji, aby zastosować zmiany… Zmieniono serwer kont Mozilli/synchronizacji. Wyłączanie aplikacji, aby zastosować zmiany… @@ -576,8 +549,6 @@ Zaloguj się i synchronizuj karty, zakładki, hasła i więcej. - Konto Firefoksa - Konto Mozilli Połącz ponownie, aby wznowić synchronizację @@ -589,8 +560,6 @@ Zbieranie danych Zdalne debugowanie przez USB - - Wyszukiwarki Podpowiedzi wyszukiwania @@ -723,12 +692,6 @@ Przeglądaj dodatki - - - Dodatek nie jest obsługiwany - - Dodatek jest już zainstalowany - Dodatki zostały tymczasowo wyłączone @@ -1368,6 +1331,11 @@ Zamknij prywatne karty + + + Czy zamknąć prywatne karty? + Stuknij lub przeciągnij to powiadomienie, aby zamknąć prywatne karty. + Marketing @@ -1608,6 +1576,8 @@ Wszystkie ciasteczka (spowoduje niepoprawne działanie stron) Izolowanie ciasteczek między witrynami + + Informowanie witryn, że mają nie udostępniać ani nie sprzedawać moich danych Treści z elementami śledzącymi @@ -1945,28 +1915,18 @@ Dodaj nową wyszukiwarkę Edytuj wyszukiwarkę - - Dodaj - - Zapisz Edytuj Usuń - - Inna Nazwa - - Nazwa Nazwa wyszukiwarki Adres ciągu wyszukiwania - Używany ciąg wyszukiwania - Adres używany do wyszukiwania Wyszukiwany tekst zastąp „%s”. Przykład:\nhttps://www.google.pl/search?q=%s @@ -2193,6 +2153,9 @@ Przejdź do ustawień + + „%s” + zwinąć @@ -2210,4 +2173,204 @@ otworzyć odnośnik z informacjami %s, nagłówek + + + Odnośniki + + Dostępne są odnośniki + + + + + + Przetłumaczyć tę stronę? + + Wypróbuj prywatne tłumaczenia w przeglądarce %1$s + + Ze względu na Twoją prywatność tłumaczenia nigdy nie opuszczają Twojego urządzenia. Wkrótce nowe języki i ulepszenia! %1$s + + Więcej informacji + + Język źródłowy: + + Język docelowy: + + Nie teraz + + OK + + Przetłumacz + + Spróbuj ponownie + + Tłumaczenie + + Trwa tłumaczenie + + Wystąpił problem przy tłumaczeniu. Spróbuj ponownie. + + Nie można wczytać języków. Sprawdź połączenie z Internetem i spróbuj ponownie. + + Nie obsługujemy jeszcze tego języka (%1$s). + + Więcej informacji + + + + Opcje tłumaczenia + + Zawsze proponuj tłumaczenie + + Zawsze tłumacz ten język (%1$s) + + Nigdy nie tłumacz tego języka (%1$s) + + Nigdy nie tłumacz tej witryny + + Ustawienia tłumaczenia + + Informacje o tłumaczeniach w przeglądarce %1$s + + + + Tłumaczenia + + + Proponuj tłumaczenie, kiedy to możliwe + + Pobieraj języki także w trybie oszczędzania danych + + Preferencje tłumaczenia + + Automatyczne tłumaczenie + + Nigdy nie tłumacz tych witryn + + Pobierz języki + + + + Automatyczne tłumaczenie + + Wybierz język, aby zarządzać preferencjami „zawsze tłumacz” i „nigdy nie tłumacz”. + + + + Proponuj tłumaczenie (domyślnie) + + %1$s będzie proponował tłumaczenie witryn w tym języku. + + Zawsze tłumacz + + %1$s będzie automatycznie tłumaczył ten język po wczytaniu strony. + + Nigdy nie tłumacz + + %1$s nigdy nie będzie proponował tłumaczenia witryn w tym języku. + + + + Nigdy nie tłumacz tych witryn + + + Aby dodać nową witrynę: otwórz ją i wybierz „Nigdy nie tłumacz tej witryny” z menu tłumaczenia. + + Usuń „%1$s” + + Czy usunąć „%1$s”? + + Usuń + + Anuluj + + + + Pobierz języki + + Pobierz pełne języki, aby przyspieszyć tłumaczenie i tłumaczyć bez dostępu do Internetu. %1$s + + Więcej informacji + + Dostępne języki + + wymagany + + %1$s (%2$s) + + Pobierz języki + + Wszystkie języki + + Usuń + + W trakcie + + Pobierz + + Wybrany + + + Czy usunąć ten język (%1$s – %2$s)? + + Jeśli usuniesz ten język, %1$s podczas tłumaczenia pobierze częściowe języki do pamięci podręcznej. + + Czy usunąć wszystkie języki (%1$s)? + + Jeśli usuniesz wszystkie języki, %1$s podczas tłumaczenia pobierze częściowe języki do pamięci podręcznej. + + Usuń + + Anuluj + + + Na pewno pobrać w trybie oszczędzania danych (%1$s)? + + Pobieramy częściowe języki do pamięci podręcznej urządzenia, aby zachować prywatność tłumaczeń. + + Pobieraj także w trybie oszczędzania danych + + Pobierz + + Pobierz i przetłumacz + + Anuluj + + + + Narzędzia do debugowania + + Przejdź wstecz + + Narzędzia kart + + Liczba kart + + Aktywne + + Nieaktywne + + Prywatne + + Razem + + Narzędzie do tworzenia kart + + Liczba kart do utworzenia + + Dodaj do aktywnych kart + + Dodaj do nieaktywnych kart + + Dodaj do prywatnych kart diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 665b4bcb6521..7032e588af56 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -68,11 +68,6 @@ Não deixe rastros neste dispositivo - - O %1$s exclui seus cookies, histórico e dados de sites quando você fecha todas as janelas privativas. %2$s Procurar na página + + Traduzir página Salvar em coleção @@ -333,14 +330,8 @@ Agora não - - Torne o Firefox seu navegador padrão Adoramos manter você seguro - - O Firefox coloca as pessoas acima dos lucros e defende sua privacidade bloqueando rastreadores entre sites.\n\nSaiba mais em nosso aviso de privacidade. Nosso navegador respaldado por uma entidade sem fins lucrativos ajuda a impedir que empresas sigam você secretamente pela web.\n\nSaiba mais em nosso aviso de privacidade. Agora não - Passe do celular para o computador e vice-versa - Proteja-se com criptografia ao alternar entre dispositivos - - Pegue abas e senhas de seus outros dispositivos para continuar de onde parou. Uma vez conectado e sincronizado, você fica mais seguro. O Firefox criptografa senhas, favoritos e muito mais. @@ -363,15 +350,9 @@ Entrar Agora não - - Notificações ajudam você a aproveitar mais o Firefox Notificações ajudam você a ficar mais seguro com o Firefox - - Envie abas entre dispositivos, gerencie downloads e receba dicas de como aproveitar ao máximo o Firefox. Envie abas entre seus dispositivos com segurança e descubra outros recursos de privacidade no Firefox. @@ -413,8 +394,6 @@ Selecione um - Gerenciar atalhos de pesquisa - Gerencie mecanismos de pesquisa alternativos Editar mecanismos visíveis no menu de pesquisa @@ -428,8 +407,6 @@ Mecanismos de pesquisa Sugestões de mecanismos de pesquisa - - Barra de endereços Preferências da barra de endereços @@ -467,7 +444,7 @@ Bloqueador de avisos de cookies - Bloqueador de avisos de cookies na navegação privada + Bloqueador de avisos de cookies na navegação privativa Reduzir avisos de cookies @@ -553,14 +530,10 @@ No entanto, também é possível que um invasor esteja envolvido. Se você continuar para o site, não deve inserir nenhuma informação sensível. Se continuar, o modo somente HTTPS é desativado temporariamente no site. Acessibilidade - - Servidor personalizado de conta Firefox Servidor personalizado de conta Mozilla Servidor personalizado de sincronização - - Modificado o servidor de conta/sincronização Firefox. Saindo do aplicativo para aplicar as mudanças… Modificado o servidor de conta Mozilla e sincronização. Saindo do aplicativo para aplicar as mudanças… @@ -578,8 +551,6 @@ Entre para sincronizar abas, favoritos, senhas e muito mais. - Conta Firefox - Conta Mozilla Reconecte para retomar a sincronização @@ -591,8 +562,6 @@ Coleta de dados Depuração remota via USB - - Mostrar mecanismos de pesquisa Mostrar sugestões de pesquisa @@ -725,12 +694,6 @@ Descobrir extensões - - - Extensão não suportada - - Extensão já instalada - As extensões estão temporariamente desativadas @@ -1366,6 +1329,12 @@ Fechar abas privativas + + + Fechar abas privativas? + + Toque ou deslize esta notificação para fechar as abas privativas. + Marketing @@ -1606,6 +1575,8 @@ Todos os cookies (atrapalha vários sites) Isolar cookies entre sites + + Dizer aos sites para não compartilhar nem vender meus dados Conteúdo com rastreamento @@ -1945,28 +1916,18 @@ Adicionar mecanismo de pesquisa Editar mecanismo de pesquisa - - Adicionar - - Salvar Editar Excluir - - Outro Nome - - Nome Nome do mecanismo de pesquisa URL do código de pesquisa - Código de pesquisa a ser usado - URL a usar para pesquisar Substitua a consulta por “%s”. Por exemplo:\nhttps://www.google.com/search?q=%s @@ -2197,8 +2158,6 @@ - Verificador de avaliações - Verificador de avaliações Avaliações confiáveis @@ -2211,7 +2170,9 @@ Classificação ajustada - Avaliações não confiáveis removidas + Avaliações não confiáveis removidas + + Baseado em avaliações confiáveis Destaques de avaliações recentes @@ -2222,14 +2183,10 @@ nota com letra de A a F.]]> Avaliações confiáveis. Acreditamos que as avaliações provavelmente são de consumidores reais que deixaram avaliações honestas e imparciais. - - Acreditamos que as avaliações são confiáveis. Acreditamos que há uma mistura de avaliações confiáveis e não confiáveis. Avaliações não confiáveis. Acreditamos que as avaliações provavelmente são falsas ou de avaliadores tendenciosos. - - Acreditamos que as avaliações não são confiáveis. classificação ajustada é baseada apenas em avaliações que acreditamos ser confiáveis.]]> @@ -2246,8 +2203,6 @@ Mostrar anúncios no verificador de avaliações - Aparecem anúncios ocasionais de produtos relevantes. Todos os anúncios devem atender aos nossos padrões de qualidade de avaliações. %s - Aparecem anúncios ocasionais de produtos relevantes. Só anunciamos produtos com avaliações confiáveis. %s Saiba mais @@ -2270,24 +2225,24 @@ Quando este produto tiver mais avaliações, poderemos verificar sua qualidade. - O produto não está disponível + O produto não está disponível - Se você perceber que tem este produto novamente em estoque, informe para nós e trabalharemos na verificação de avaliações. + Se você perceber que tem este produto novamente em estoque, informe para nós e trabalharemos na verificação de avaliações. - Informar que tem este produto em estoque novamente - - Informar que tem o produto em estoque + Informar que tem o produto em estoque - Verificando a qualidade das avaliações + Verificando a qualidade das avaliações - Verificando a qualidade das avaliações + Verificando a qualidade das avaliações + + Verificando a qualidade das avaliações (%s) Isso pode demorar cerca de 60 segundos. - Obrigado por informar! + Obrigado por informar! - Devemos ter informações sobre as avaliações deste produto em até 24 horas. Verifique novamente mais tarde. + Devemos ter informações sobre as avaliações deste produto em até 24 horas. Verifique novamente mais tarde. Não podemos verificar essas avaliações @@ -2326,17 +2281,17 @@ Saiba mais - Ao selecionar “Sim, experimentar”, você concorda com a %2$s e os %3$s do %1$s da Mozilla. + Ao selecionar “Sim, experimentar”, você concorda com a %2$s e os %3$s do %1$s da Mozilla. - Ao selecionar “Sim, experimentar” você declara que concorda com o seguinte da %1$s: + Ao selecionar “Sim, experimentar” você declara que concorda com o seguinte da %1$s: - política de privacidade + política de privacidade - Política de privacidade + Política de privacidade - termos de uso + termos de uso - Termos de uso + Termos de uso Sim, experimentar @@ -2373,6 +2328,9 @@ Competitividade + + “%s” + recolher @@ -2390,4 +2348,205 @@ abrir o link para saber mais %s, título de seção + + + Links + + Links disponíveis + + + + + + Traduzir esta página? + + Experimente tradução privativa no %1$s + + Para sua privacidade, o texto de tradução nunca sai do seu dispositivo. Novos idiomas e melhorias em breve! %1$s + + + Saiba mais + + Traduzir de + + Traduzir para + + Agora não + + Pronto + + Traduzir + + Tentar novamente + + Traduzindo + + Tradução em andamento + + + Houve um problema ao traduzir. Tente novamente. + + Não foi possível carregar idiomas. Verifique sua conexão com a internet e tente novamente. + + Desculpe, ainda não há suporte para %1$s. + + Saiba mais + + + + Opções de tradução + + Sempre oferecer tradução + + Sempre traduzir %1$s + + Nunca traduzir %1$s + + Nunca traduzir este site + + Configurações de tradução + + Sobre tradução no %1$s + + + + Tradução + + Oferecer tradução quando possível + + Sempre baixar idiomas no modo de economia de dados + + Preferências de tradução + + Tradução automática + + Nunca traduzir esse sites + + Baixar idiomas + + + + Tradução automática + + Selecione um idioma para gerenciar as preferências de ”sempre traduzir“ e ”nunca traduzir“. + + + + Oferecer tradução (padrão) + + O %1$s oferece tradução de sites neste idioma. + + Sempre traduzir + + O %1$s traduz este idioma automaticamente quando a página é carregada. + + Nunca traduzir + + O %1$s nunca oferece tradução de sites neste idioma. + + + + Nunca traduzir esse sites + + Para adicionar um site: Abra em uma aba e selecione “Nunca traduzir este site” no menu de tradução. + + Remover %1$s + + Excluir %1$s? + + Excluir + + Cancelar + + + + Baixar idiomas + + Baixar idiomas completos para tradução mais rápida e traduzir sem acesso à internet. %1$s + + Saiba mais + + Idiomas disponíveis + + obrigatório + + %1$s (%2$s) + + Baixar idiomas + + Todos os idiomas + + Excluir + + Em andamento + + Baixar + + Selecionado + + + Excluir %1$s (%2$s)? + + + Se excluir este idioma, o %1$s irá baixar partes do idioma no cache à medida que você pede traduções. + + Excluir todos os idiomas (%1$s)? + + Se excluir todos os idiomas, o %1$s irá baixar partes de idiomas no cache à medida que você pede traduções. + + Excluir + + Cancelar + + + Baixar no modo de economia de dados (%1$s)? + + Partes de idiomas são baixadas no cache para manter a tradução privativa. + + Sempre baixar no modo de economia de dados + + Baixar + + Baixar e traduzir + + Cancelar + + + + Ferramentas de depuração + + Voltar à página anterior + + Ferramentas de abas + + Número de abas + + Ativas + + Inativas + + Privativas + + Total + + Ferramenta de criação de abas + + Número de abas a criar + + Adicionar às abas ativas + + Adicionar às abas inativas + + Adicionar às abas privativas diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 308f9b44f683..2146d3212b2b 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -524,6 +524,11 @@ Permitir + + %1$s acabou de recusar cookies por si + + Menos distrações, menos cookies rastreando-o(a) neste site. + Automaticamente tenta conectar-se a sites utilizando o protocolo de encriptação HTTPS para uma melhor segurança. @@ -633,6 +638,8 @@ Extras + + Instalar extra a partir de ficheiro Notificações @@ -2246,8 +2253,6 @@ Anúncio de %s - O verificador de avaliações é desenvolvido por %s. - O verificador de avaliações é suportado por %s %s por Mozilla @@ -2307,6 +2312,8 @@ Experimente o nosso guia confiável para avaliações de produtos Veja o quão confiáveis são as avaliações dos produtos em %1$s antes de comprar. O verificador de avaliações, uma funcionalidade experimental do %2$s, está integrado no navegador. Funciona em %3$s e também em %4$s. + + Veja o quão confiáveis são as avaliações dos produtos em %1$s antes de comprar. O Verificador de Avaliações, uma funcionalidade experimental do %2$s, está integrado no navegador. Utilizando o poder do %1$s da Mozilla, ajudamos a que evite avaliações tendenciosas e falsas. O nosso modelo de IA está sempre a melhorar para sua proteção, enquanto faz compras. %2$s @@ -2373,4 +2380,6 @@ ler o artigo abrir ligação para saber mais + + %s, Título diff --git a/app/src/main/res/values-rm/strings.xml b/app/src/main/res/values-rm/strings.xml index 3f867503b09e..9d9fbb672b23 100644 --- a/app/src/main/res/values-rm/strings.xml +++ b/app/src/main/res/values-rm/strings.xml @@ -66,11 +66,6 @@ Na laschar nagins fastizs sin quest apparat - - %1$s stizza tes cookies, la cronologia e datas da websites cura che ti serras tut tias fanestras privatas. %2$s Tschertgar en la pagina + + Translatar la pagina Memorisar en ina collecziun @@ -325,14 +322,8 @@ Betg ussa - - Fa da Firefox tes navigatur preferì Nus ta protegin cun plaschair - - Firefox dat la prioritad a las persunas, betg al profit e defenda tia sfera privata cun bloccar fastizaders interpaginals.\n\nUlteriuras infurmaziuns èn da chattar en nossas infurmaziuns davart la protecziun da datas. Noss navigatur dad in\'organisaziun senza finamira da profit, gida ad evitar che interpresas ta persequiteschian a la zuppada en il web.\n \nLegia dapli dal tema en nossas infurmaziuns davart la protecziun da datas. @@ -344,11 +335,7 @@ Betg ussa - Mida dal telefonin al laptop ed enavos - Criptescha tias datas cun midar dad in apparat a tschel - - Va per tabs e pleds-clav da tes auters apparats per cuntinuar là nua che ti has chalà. Sche ti es annunzià e sincroniseschas tias datas, es ti pli segir. Firefox criptescha tes pleds-clav, segnapaginas e dapli. @@ -356,15 +343,9 @@ S\'annunziar Betg ussa - - Communicaziuns ta gidan da far dapli cun Firefox Cun communicaziuns es ti pli segir en Firefox - - Trametta tabs dad in apparat a l\'auter, administrescha telechargiadas e ve a savair co profitar il meglier pussaivel da Firefox. Trametta tabs a moda segira dad in da tes apparats a tschel e scuvra autras funcziuns per la protecziun da datas da Firefox. @@ -406,8 +387,6 @@ Tscherner in\'opziun - Administrar las scursanidas per tschertgas - Administrar maschinas da tschertgar alternativas Modifitgar las maschinas visiblas en il menu da tschertga @@ -421,8 +400,6 @@ Maschinas da tschertgar Propostas da maschinas da tschertgar - - Trav d\'adressas Preferenzas per la trav d\'adressas @@ -543,14 +520,10 @@ Tuttina èsi pussaivel ch\'i sa tracta dad ina attatga. Sche ti visitas la website, na duessas ti endatar naginas infurmaziuns sensiblas. Sche ti cuntinueschas vegn il modus mo HTTPS deactivà temporarmain per la website. Accessibladad - - Server persunalisà per tes conto da Firefox Agen server per contos Mozilla Server persunalisà per Sync - - Il server per il conto da Firefox/Sync è vegnì modifitgà. L\'applicaziun vegn serrada per applitgar las midadas… Il server per il conto da Mozilla/Sync è vegnì modifitgà. L\'applicaziun vegn serrada per applitgar las midadas… @@ -568,8 +541,6 @@ T\'annunzia per sincronisar tabs, segnapaginas, pleds-clav e dapli. - Conto da Firefox - Conto Mozilla Ta reconnectescha per cuntinuar cun la sincronisaziun @@ -581,8 +552,6 @@ Datas rimnadas Debugging a distanza via USB - - Mussar las maschinas da tschertgar Mussar propostas da tschertga @@ -713,12 +682,6 @@ Scuvrir ils supplements - - - Il supplement na vegn betg sustegnì - - Il supplement è gia installà - Ils supplements èn deactivads temporarmain @@ -1351,6 +1314,10 @@ Serrar ils tabs privats + + Serrar ils tabs privats? + Tutga u stauscha quest avis per serrar ils tabs privats. + Marketing @@ -1591,6 +1558,8 @@ Tut ils cookies (tschertas websites na funcziunan betg pli endretg) Isolar cookies interpaginals + + Dir a websites da betg cundivider e vender mias datas Cuntegn che fastizescha @@ -1936,29 +1905,19 @@ Agiuntar ina nova maschina da tschertgar Modifitgar la maschina da tschertgar - - Agiuntar - - Memorisar Modifitgar Stizzar - - Auter Num - - Num Num da la maschina da tschertgar URL dal string da tschertga - String da tschertga per utilisar - Utilisar quest URL per la tschertga Remplazzar il term da tschertga cun «%s». Per exempel: \nhttps://www.google.com/search?q=%s @@ -2187,8 +2146,6 @@ - Verificatur da recensiuns - Verificaziun da recensiuns Recensiuns fidablas @@ -2201,7 +2158,9 @@ Valitaziun rectifitgada - Allontanà recensiuns dubiusas + Allontanà recensiuns dubiusas + + A basa da recensiuns fidablas Highlights da las ultimas recensiuns @@ -2212,14 +2171,10 @@ nota en letras dad A enfin F.]]> Recensiuns fidablas. Nus cartain che las recensiuns èn cun auta probabilitad da dretgs clients che han scrit recensiuns onestas independentas. - - Nus cartain che las recensiuns èn fidablas. Nus cartain ch\'i sa tracta dad ina maschaida da recensiuns fidablas e dubiusas. Revistas dubiusas. Nus cartain che las recensiuns èn probablamain sfalsifitgadas u da recensents partischants. - - Nus cartain che las recensiuns n\'èn betg fidablas. valitaziun rectifitgada sa basa mo sin recensiuns da las qualas nus cartain ch\'ellas sajan fidablas.]]> @@ -2235,8 +2190,6 @@ Mussar reclamas en la verificaziun da recensiuns - I vegnan mussadas reclamas occasiunalas per products relevants. Tut las reclamas ston resguardar noss standards da qualitad per recensiuns. %s - I vegnan mussadas reclamas occasiunalas per products relevants. Nus faschain mo reclama per products cun recensiuns fidablas. %s Ulteriuras infurmaziuns @@ -2259,23 +2212,23 @@ Uschespert che quest product ha dapli recensiuns, vegnin nus a pudair controllar lur qualitad. - Il product n\'è betg disponibel + Il product n\'è betg disponibel - Sche ti vesas che quest product è puspè disponibel, annunzia quai e nus vegnin a lavurar per controllar las recensiuns. + Sche ti vesas che quest product è puspè disponibel, annunzia quai e nus vegnin a lavurar per controllar las recensiuns. - Rapportar che quest product è puspè disponibel - - Annunziar ch\'il product è disponibel + Annunziar ch\'il product è disponibel - Controllar la qualitad da las recensiuns + Controllar la qualitad da las recensiuns - Controllar la qualitad da las recensiuns + Controllar la qualitad da las recensiuns + + Controllar la qualitad da las recensiuns (%s) Quai po cuzzar var 60 secundas. - Grazia per rapportar! + Grazia per rapportar! - Nus stuessan avair infurmaziuns davart las recensiuns da quest product entaifer las proximas 24 uras. Controllescha pli tard anc ina giada. + Nus stuessan avair infurmaziuns davart las recensiuns da quest product entaifer las proximas 24 uras. Controllescha pli tard anc ina giada. Nus na pudain betg controllar questas recensiuns @@ -2313,17 +2266,17 @@ Ulteriuras infurmaziuns - Cun tscherner «Gea, empruvar» acceptas ti las %2$s e las %3$s da %1$s da Mozilla. + Cun tscherner «Gea, empruvar» acceptas ti las %2$s e las %3$s da %1$s da Mozilla. - Cun tscherner «Gea, empruvar», acceptas ti ils suandants puncts da %1$s: + Cun tscherner «Gea, empruvar», acceptas ti ils suandants puncts da %1$s: - directivas per la protecziun da datas + directivas per la protecziun da datas - Directivas per la protecziun da datas + Directivas per la protecziun da datas - cundiziuns d\'utilisaziun + cundiziuns d\'utilisaziun - Cundiziuns d\'utilisaziun + Cundiziuns d\'utilisaziun Gea, empruvar @@ -2359,6 +2312,9 @@ Cumpetitivitad + + «%s» + reducir @@ -2376,4 +2332,202 @@ avrir la colliaziun per vegnir a savair dapli %s, titel + + Colliaziuns + + Colliaziuns disponiblas + + + + + + Translatar questa pagina? + + Emprova las translaziuns privatas en %1$s + + Per la protecziun da tias datas, na bandunan ils texts mai tes apparat. Novas linguas ed optimaziuns suondan prest! %1$s + + Ulteriuras infurmaziuns + + Translatar da + + Translatar en + + Betg ussa + + Finì + + Translatar + + Reempruvar + + Translatar + + Translaziun en elavuraziun + + Igl ha dà in problem cun translatar. Emprova per plaschair anc ina giada. + + Impussibel da chargiar las linguas. Controllescha tia connexiun cun l’internet ed emprova anc ina giada. + + Perstgisa, nus na sustegnain anc betg %1$s. + + Ulteriuras infurmaziuns + + + + Opziuns da translaziun + + Adina offrir da translatar + + Adina translatar %1$s + + Mai translatar %1$s + + Mai translatar questa website + + Parameters da translaziun + + Davart translaziuns en %1$s + + + + Translaziuns + + Offrir da translatar sche pussaivel + + Adina telechargiar linguas en il modus per spargnar datas + + Preferenzas da translaziun + + Translaziun automatica + + Mai translatar questa websites + + Telechargiar linguas + + + + Translaziun automatica + + Tscherna ina lingua per definir las preferenzas «adina translatar» e «mai translatar». + + + + Offrir da translatar (predefinì) + + %1$s vegn ad offrir da translatar websites en questa lingua. + + Adina translatar + + %1$s vegn a translatar automaticamain questa lingua cun chargiar la pagina. + + Mai translatar + + %1$s na vegn mai ad offrir da translatar websites en questa lingua. + + + + Mai translatar questas websites + + + Per agiuntar ina nova website: Visita la website e tscherna «Mai translatar questa website» en il menu da translaziun. + + Allontanar %1$s + + Stizzar %1$s? + + Stizzar + + Interrumper + + + + Telechargiar linguas + + Telechargia cumplettamain las linguas per translatar pli svelt e senza connexiun. %1$s + + Ulteriuras infurmaziuns + + Linguas disponiblas + + obligatoric + + %1$s (%2$s) + + Telechargiar linguas + + Tut las linguas + + Stizzar + + En elavuraziun + + Telechargiar + + Selecziunà + + + Stizzar %1$s (%2$s)? + + Sche ti stizzas questa lingua, vegn %1$s a telechargiar parzialmain linguas en tes cache durant la translaziun. + + Stizzar tut las linguas (%1$s)? + + Sche ti stizzas tut las linguas vegn %1$s a telechargiar parzialmain linguas en tes cache durant la translaziun. + + Stizzar + + Interrumper + + + Telechargiar en il modus per spargnar datas (%1$s)? + + Nus translatain parzialmain linguas en tes cache per che las translaziuns restian privatas. + + Adina telechargiar en il modus per spargnar datas + + Telechargiar + + Telechargiar e translatar + + Interrumper + + + + Utensils da debugadi + + Turnar enavos + + Utensils per ils tabs + + Dumber da tabs + + Activs + + Inactivs + + Privats + + Total + + Utensil per crear tabs + + Dumber da tabs da crear + + Agiuntar als tabs activs + + Agiuntar als tabs inactivs + + Agiuntar als tabs privats diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index a196d140d9be..f941498a897b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -72,11 +72,6 @@ Не оставлять следов на этом устройстве - - %1$s удаляет ваши куки, историю и данные сайтов, когда вы закрываете все свои приватные окна. %2$s Найти на странице + + Перевести страницу В сборник @@ -339,14 +336,8 @@ Не сейчас - - Сделайте Firefox своим повседневным браузером Нам нравится обеспечивать вашу безопасность - - Firefox ставит людей выше прибыли и защищает вашу приватность, блокируя межсайтовые трекеры.\n\nУзнайте больше в нашем уведомлении о конфиденциальности. Наш браузер, поддерживаемый некоммерческой организацией, помогает ограничивать компании от слежки за вами в Интернете.\n\nПодробнее читайте в нашем уведомлении о конфиденциальности. Не сейчас - Переходите с телефона на ноутбук и обратно - Оставайтесь зашифрованными при переходе между устройствами - - Возьмите вкладки и пароли с других ваших устройств, чтобы продолжить с того места, на котором вы остановились. Когда вы вошли в систему и провели синхронизацию, вы в большей безопасности. Firefox шифрует ваши пароли, закладки и многое другое. @@ -369,15 +356,9 @@ Войти Не сейчас - - Уведомления помогают вам делать с Firefox больше Уведомления помогают вам оставаться в безопасности с Firefox - - Отправляйте вкладки между устройствами, управляйте загрузками и получайте советы по максимально эффективному использованию Firefox. Безопасно пересылайте вкладки между своими устройствами и откройте для себя другие функции конфиденциальности в Firefox. @@ -420,8 +401,6 @@ Выберите - Управление ярлыками поисковиков - Управление альтернативными поисковыми системами Редактировать системы, видимые в меню поиска @@ -435,8 +414,6 @@ Поисковые системы Предложения от поисковых систем - - Адресная строка Настройки адресной строки @@ -559,14 +536,10 @@ Однако возможно вмешательство злоумышленников. Если вы продолжите переход на сайт, вам не следует вводить на нём какие-либо личные данные. Если вы продолжите, режим «Только HTTPS» для этого сайта будет временно отключён. Специальные возможности - - Пользовательский сервер аккаунта Firefox Пользовательский сервер аккаунтов Mozilla Пользовательский сервер Синхронизации - - Сервер аккаунтов/синхронизации Firefox был изменён. Закрываем приложение, чтобы применить изменения… Изменён аккаунт Mozilla/сервер синхронизации. Выход из приложения для применения изменений… @@ -584,8 +557,6 @@ Входить для синхронизации вкладок, закладок, паролей и многого другого. - Аккаунт Firefox - Аккаунт Mozilla Подключитесь снова, чтобы возобновить синхронизацию @@ -597,8 +568,6 @@ Сбор данных Удалённая отладка по USB - - Показывать поисковые системы Поисковые предложения @@ -731,12 +700,6 @@ Исследуйте дополнения - - - Дополнение не поддерживается - - Дополнение уже установлено - Дополнения временно отключены @@ -1388,6 +1351,11 @@ Закройте приватные вкладки + + + Закрыть приватные вкладки? + Нажмите или проведите по этому уведомлению, чтобы закрыть приватные вкладки. + Маркетинг @@ -1630,6 +1598,8 @@ Все куки (нарушит работу сайтов) Изолировать межсайтовые куки + + Запретить веб-сайтам делиться и продавать данные Отслеживающее содержимое @@ -1964,28 +1934,18 @@ Добавить новую поисковую систему Изменение поисковой системы - - Добавить - - Сохранить Изменить Удалить - - Другое Имя - - Имя Имя поисковой системы URL строки поиска - Используемая поисковая строка - URL для поиска Замените строку запроса на «%s». Пример:\nhttps://www.google.com/search?q=%s @@ -2215,8 +2175,6 @@ - Инструмент проверки отзывов - Проверка отзывов Достоверные отзывы @@ -2229,7 +2187,9 @@ Скорректированный рейтинг - Недостоверные отзывы удалены + Недостоверные отзывы удалены + + На основе достоверных отзывов Основные моменты из недавних обзоров @@ -2240,14 +2200,10 @@ буквенную оценку от A до F.]]> Достоверные отзывы. Мы считаем, что эти отзывы, скорее всего, написаны реальными клиентами, которые оставили честные и объективные отзывы. - - Мы считаем, что эти отзывы заслуживают доверия. Мы считаем, что здесь находится смесь достоверных и недостоверных отзывов. Недостоверные отзывы. Мы считаем, что эти отзывы, скорее всего, фейковые или написаны предвзятыми рецензентами. - - Мы считаем, что эти отзывы недостоверны. Скорректированная оценка основана только на отзывах, которые мы считаем достоверными.]]> @@ -2263,8 +2219,6 @@ Показывать рекламу в инструменте проверки отзывов - Время от времени вы будете видеть рекламу соответствующих продуктов. Все объявления должны соответствовать нашим стандартам качества проверки. %s - Время от времени вы будете видеть рекламу интересных продуктов. Мы рекламируем только товары с достоверными отзывами. %s Подробнее @@ -2287,23 +2241,23 @@ Когда у этого товара будет больше отзывов, мы сможем проверить его качество. - Товар недоступен + Товар недоступен - Если вы увидите, что этот товар снова в наличии, сообщите об этом, и мы проверим отзывы. - - Сообщить, что этот товар снова в наличии + Если вы увидите, что этот товар снова в наличии, сообщите об этом, и мы проверим отзывы. - Сообщить о наличии товара на складе + Сообщить о наличии товара на складе - Проверяем качество отзывов + Проверяем качество отзывов - Проверяем качество отзывов + Проверяем качество отзывов + + Проверка качество отзывов (%s) Это может занять около 60 секунд. - Спасибо за сообщение! + Спасибо за сообщение! - Мы должны получить информацию об отзывах на этот продукт в течение 24 часов. Пожалуйста, зайдите позже. + Мы должны получить информацию об отзывах на этот продукт в течение 24 часов. Пожалуйста, зайдите позже. Мы не можем проверить эти отзывы @@ -2341,17 +2295,17 @@ Узнать больше - Выбрав «Да, попробовать», вы соглашаетесь с %1$s принимая %2$s и %3$s от Mozilla. + Выбрав «Да, попробовать», вы соглашаетесь с %1$s принимая %2$s и %3$s от Mozilla. - Выбирая «Да, попробовать», вы соглашаетесь со следующим от %1$s: + Выбирая «Да, попробовать», вы соглашаетесь со следующим от %1$s: - политику приватности + политику приватности - Политика конфиденциальности + Политика конфиденциальности - условия использования + условия использования - Условия использования + Условия использования Да, попробовать @@ -2388,6 +2342,9 @@ Конкурентоспособность + + «%s» + свернуть @@ -2438,4 +2395,205 @@ Отмена %s, Заголовок + + %s, Заголовок + + + Ссылки + + Доступны ссылки + + + + + + Перевести эту страницу? + + Попробуйте конфиденциальные переводы в %1$s + + Для вашей конфиденциальности переводы никогда не покидают ваше устройство. Скоро появятся новые языки и улучшения! %1$s + + Узнать больше + + Перевести с + + Перевести на + + Не сейчас + + Готово + + Перевести + + Попробовать снова + + Перевод + + Идёт перевод + + + При переводе возникла проблема. Пожалуйста, попробуйте ещё раз. + + Не удалось загрузить языки. Проверьте подключение к Интернету и повторите попытку. + + К сожалению, мы пока не поддерживаем %1$s. + + Узнать больше + + + + Настройки перевода + + Всегда предлагать перевод + + Всегда переводить %1$s + + Никогда не переводить %1$s + + Никогда не переводить этот сайт + + Настройки перевода + + О переводах в %1$s + + + + Переводы + + По возможности предлагать перевод + + Всегда загружать языки в режиме экономии трафика + + Настройки перевода + + Автоматический перевод + + Никогда не переводить эти сайты + + Загрузить языки + + + + Автоматический перевод + + Выберите язык для управления настройками «всегда переводить» и «никогда не переводить». + + + + Предлагать перевод (по умолчанию) + + %1$s будет предлагать перевод сайтов на этом языке. + + Всегда переводить + + %1$s будет переводить на этот язык автоматически при загрузке страницы. + + Никогда не переводить + + %1$s никогда не будет предлагать перевод сайтов на этом языке. + + + + Никогда не переводить эти сайты + + Чтобы добавить новый сайт: Посетите его и выберите «Никогда не переводить этот сайт» в меню перевода. + + Удалить %1$s + + Удалить %1$s? + + Удалить + + Отмена + + + + Загрузка языков + + Загрузите полные языки для более быстрого перевода и для перевода в автономном режиме. %1$s + + Подробнее + + Доступные языки + + требуется + + %1$s (%2$s) + + Загрузка языков + + Все языки + + Удалить + + В процессе + + Загрузить + + Выбрано + + + Удалить %1$s (%2$s)? + + Если вы удалите этот язык, %1$s будет частично загружать языки в ваш кеш по мере перевода. + + Удалить все языки (%1$s)? + + Если вы удалите все языки, %1$s будет загружать в ваш кеш языки частично по мере перевода. + + Удалить + + Отмена + + + Загрузить в режиме сохранения трафика (%1$s)? + + Мы загружаем в ваш кеш неполные языки, чтобы обеспечить конфиденциальность переводов. + + Всегда загружать в режиме сохранения трафика + + Загрузить + + Загрузить и перевести + + Отмена + + + + Инструменты отладки + + Перейти назад + + Инструменты вкладок + + Число вкладок + + Активных + + Неактивных + + Приватных + + Всего + + Инструмент создания вкладок + + Количество вкладок для создания + + Добавить в активные вкладки + + Добавить в неактивные вкладки + + Добавить в приватные вкладки diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 4f967fa723d6..a79b99221047 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -68,11 +68,6 @@ මෙම උපාංගයේ කිසිදු හෝඩුවාවක් නොතබයි - - ඔබ සියළුම පෞද්ගලික කවුළු වැසූ විට, %1$s ඔබගේ දත්තකඩ, ඉතිහාසය සහ අඩවිවල දත්ත මකා දමයි. %2$s වැඩතල අඩවිය + + සාමාන්‍ය පටිත්තක අරින්න මුල් තිරයට යොදන්න @@ -210,6 +207,8 @@ යළි සමමුහූර්තය පිටුවේ සොයන්න + + පිටුව පරිවර්තනය එකතුවට සුරකින්න @@ -322,14 +321,8 @@ දැන් නොවේ - - ෆයර්ෆොක්ස් ප්‍රධාන අතිරික්සුව කරන්න ඔබට ආරක්‍ෂාව සලසන්නෙමු - - ෆයර්ෆොක්ස් සැමවිට ලාභයට ඉහළින් මිනිසුන්ව තබයි. හරස්-අඩවි ලුහුබැඳීම් අවහිර කර ඔබගේ පෞද්ගලිකත්‍වය රැක දෙයි.\n\nඅපගේ පෞද්ගලිකත්‍ව දැන්වීම හරහා තව දැනගන්න. සමාගම් රහසින් අන්තර්ජාලය පුරා ඔබව ලුහුබැඳීම නැවැත්වීමට අපගේ ලාභ නොලබන පිටුබලයක් සහිත අතිරික්සුව සැමවිට උදව් කරයි.\n\nඅපගේ රහස්‍යතා දැන්වීමෙන් තව දැන ගන්න. දැන් නොවේ - දුරකථනයෙන් පරිගණකයට සහ ආපසු - ඔබ උපාංග අතර පනින විට සංකේතිතව සිටින්න - - ඔබ නතර කළ තැනින් අතට ගැනීමට ඔබගේ අනෙකුත් උපාංගවල පටිති සහ මුරපද අරගන්න. ඔබ ඇතුළු වී සමමුහූර්ත කළ විට, ඔබ ආරක්‍ෂිතයි. ෆයර්ෆොක්ස් ඔබගේ මුරපද, පොත්යොමු සහ වෙනත් දෑ සංකේතනය කරයි. @@ -352,15 +341,9 @@ පිවිසෙන්න දැන් නොවේ - - ෆයර්ෆොක්ස් සමඟ බොහෝ දෑ කිරීමට දැනුම්දීම් උපකාරී වේ ෆයර්ෆොක්ස් සමඟ ආරක්‍ෂිතව සිටීමට දැනුම්දීම් උපකාරී වේ - - උපාංග අතර පටිති යැවීමට, බාගැනීම් කළමනාකරණයට මෙන්ම ෆයර්ෆොක්ස් වෙතින් බොහෝ ප්‍රතිලාභ අත්විඳීම සඳහා ඉඟි ලබා ගන්න. ඔබගේ උපාංග අතර ආරක්‍ෂිතව පටිති යවන්න සහ වෙනත් ෆයර්ෆොක්ස් රහස්‍යතා විශේෂාංග සොයා ගන්න. @@ -395,8 +378,6 @@ එකක් තෝරගන්න - සෙවුම් කෙටිමං කළමනාකරණය - විකල්ප සෙවුම් යන්ත්‍ර කළමනාකරණය සෙවුමෙහි පෙනෙන යන්ත්‍ර සංශෝධනය @@ -410,8 +391,6 @@ සෙවුම් යන්ත්‍ර සෙවුම් යන්ත්‍ර වලින් යෝජනා - - ලිපින තීරුව ලිපින තීරුවේ අභිප්‍රේත @@ -519,14 +498,10 @@ කෙසේ වුවද, ප්‍රහාරකයෙක් සම්බන්ධ වී සිටීමට ද ඉඩ ඇත. මෙම අඩවියට ඔබ ගොඩවදින්නේ නම්, කිසිදු සංවේදී තොරතුරක් ඇතුල් නොකළ යුතුය. ඉදිරියට ගියහොත්, HTTPS-පමණි ප්‍රකාරය තාවකාලිකව මෙම අඩවිය සඳහා අක්‍රිය කෙරේ. ප්‍රවේශ්‍යතාව - - අභිරුචි ෆයර්ෆොක්ස් ගිණුම් සේවාදායකය අභිරුචි මොසිල්ලා ගිණුම් සේවාදායකය අභිරුචි සමමුහුර්ත සේවාදායකය - - ෆයර්ෆොක්ස් ගිණුම/සමමුහුර්ත සේවාදායකය වෙනස් කර ඇත. වෙනස්කම් යෙදීමට යෙදුමෙන් ඉවත් වෙමින්… මොසිල්ලා ගිණුම / සමමුහූර්ත සේවාදායකය වෙනස් කර ඇත. වෙනස්කම් යෙදීමට යෙදුමෙන් ඉවත් වෙමින්… @@ -544,8 +519,6 @@ පටිති, පොත්යොමු, මුරපද හා තවත් දෑ සමමුහූර්තයට පිවිසෙන්න. - ෆයර්ෆොක්ස් ගිණුම - මොසිල්ලා ගිණුම සමමුහූර්තය යළි ඇරඹීමට නැවත සබඳින්න @@ -557,8 +530,6 @@ දත්ත රැස් කිරීම USB හරහා දුරස්ථ නිදොස්කරණය - - සෙවුම් යන්ත්‍ර පෙන්වන්න සෙවුම් යෝජනා පෙන්වන්න @@ -604,6 +575,8 @@ එක්කහු + + ගොනුවකින් එක්කහුවක් ස්ථාපනය… දැනුම්දීම් @@ -687,12 +660,6 @@ එක්කහු ගවේශනය - - - එක්කහුව සහාය නොදක්වයි - - එක්කහුව දැනටමත් ස්ථාපිතයි - එක්කහු තාවකාලිකව අබල කර ඇත @@ -1322,6 +1289,7 @@ පෞද්. පටිති වසන්න + අළෙවිකරණය @@ -1889,28 +1857,18 @@ නව සෙවුම් යන්ත්‍රයක් යොදන්න සෙවුම් යන්ත්‍රය සංස්කරණය - - එකතු - - සුරකින්න සංස්කරණය මකන්න - - වෙනත් නම - - නම සෙවුම් යන්ත්‍රයේ නම සෙවුම් තන්තුවේ ඒ.ස.නි. - භාවිතයට සෙවුම් තන්තුව - සෙවීමට භාවිතා කරන ඒ.ස.නි. “%s” සමඟ විමසුම ප්‍රතිස්ථාපනය කරන්න. නිදසුන:\nhttps://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%s @@ -2127,8 +2085,6 @@ - සමාලෝචන සෝදිසිකරු - සමාලෝචන සෝදිසිකරු විශ්වසනීය සමාලෝචන @@ -2139,11 +2095,13 @@ මෙම සමාලෝචන කෙතරම් විශ්වසනීය ද? - අවිශ්වසනීය සමාලෝචන ඉවත් කර ඇත + අවිශ්වසනීය සමාලෝචන ඉවත් කර ඇත සමාලෝචනයක ගුණත්‍වය තීරණය කරන්නේ කෙසේද? %s ගැන තව දැනගන්න. + + %s සමාලෝචනයක ගුණත්‍වය තීරණය කරන්නේ කෙසේද? සැකසුම් @@ -2152,20 +2110,24 @@ තව දැනගන්න සමාලෝචන සෝදිසිකරු අක්‍රිය කරන්න + + සලකා බැලීමට තවත් දෑ + + පරීක්‍ෂා කිරීමට නව තොරතුරු පරීක්‍ෂා කරන්න ප්‍රමාණවත් සමාලෝචන නැත - නිෂ්පාදනය නොතිබේ + නිෂ්පාදනය නොතිබේ - සමාලෝචනයේ ගුණත්‍වය පරීක්‍ෂා වෙමින් + සමාලෝචනයේ ගුණත්‍වය පරීක්‍ෂා වෙමින් - සමාලෝචනයේ ගුණත්‍වය පරීක්‍ෂා වෙමින් + සමාලෝචනයේ ගුණත්‍වය පරීක්‍ෂා වෙමින් මෙයට තත්. 60 ක් පමණ ගත වනු ඇත. - වාර්තා කිරීමට ස්තූතියි! + වාර්තා කිරීමට ස්තූතියි! අපට මෙම සමාලෝචන පරීක්‍ෂාවට නොහැකිය @@ -2186,18 +2148,26 @@ ඔබගේ ජාල සම්බන්ධතාවය පරීක්‍ෂා කර පිටුව නැවත පූරණය කරන්න. මෙම සමාලෝචන ගැන තවමත් තොරතුරු නැත + + සමාලෝචනයේ ගුණත්‍වය බලන්න තව දැනගන්න - පෞද්ගලිකත්‍ව ප්‍රතිපත්තිය + පෞද්ගලිකත්‍ව ප්‍රතිපත්තිය + + රහස්‍යතා ප්‍රතිපත්තිය + + භාවිත නියම - භාවිත නියම + භාවිත නියම ඔව්, උත්සාහ කරමු දැන් නොවේ මිලදී ගැනීමට පෙර — ඔබට මෙම නිෂ්පාදනයේ සමාලෝචන විශ්වාස කළ හැකිදැයි බලන්න. + + සමාලෝචන සෝදිසිකරු බලන්න සමාලෝචන සෝදිසිකරු අරින්න @@ -2220,6 +2190,9 @@ ඇසුරුම්කරණය සහ පෙනුම + + “%s” + හැකිළීම @@ -2231,4 +2204,114 @@ ලිපිය කියවන්න තව දැන ගැනීමට සබැඳිය අරින්න + + + + + තව දැනගන්න + + + මෙයින් + + මෙයට + + දැන් නොවේ + + අහවරයි + + පරිවර්තනය + + නැවත + + පරිවර්තනය වෙමින් + + පරිවර්තනය වෙමින් පවතී + + පරිවර්තන ගැටලුවක් මතු විය. නැවත උත්සාහ කරන්න. + + තව දැනගන්න + + + + පරිවර්තන විකල්ප + + පරිවර්තන සැකසුම් + + + + පරිවර්තන + + + + ස්වයංක්‍රීය පරිවර්තනය + + + සැමවිට පරිවර්තනය කරන්න + + පරිවර්තනය නොකරන්න + + %1$s මෙම භාෂාව සහිත අඩවි පරිවර්තනය නොකරනු ඇත. + + + + මෙම අඩවි පරිවර්තනය නොකරන්න + + %1$s ඉවත් කරන්න + + %1$s මකන්නද? + + මකන්න + + අවලංගු + + + + භාෂා බාගන්න + + තව දැනගන්න + + තිබෙන භාෂා + + වුවමනාය + + භාෂා බාගන්න + + සියළුම භාෂා + + මකන්න + + බාගන්න + + තෝරාගත් + + + මකන්න + + අවලංගු + + + බාගන්න + + අවලංගු + + + සක්‍රිය + + අක්‍රිය + + පෞද්ගලික + + මුළු + + පටිති සාදන මෙවලම + + සාදන පටිති ගණන + + සක්‍රිය පටිති වෙත දමන්න + + අක්‍රිය පටිති වෙත දමන්න + + පෞද්. පටිති වෙත දමන්න diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 017932ce117c..aa1020304e31 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -70,11 +70,6 @@ Nezanechávajte na tomto zariadení žiadne stopy - - Keď zatvoríte všetky súkromné okná, %1$s odstráni vaše súbory cookie, históriu a údaje stránok. %2$s Hľadať na stránke + + Preložiť stránku Uložiť do kolekcie @@ -249,7 +246,7 @@ Upraviť - Prispôsobiť domovskú stránku + Upraviť domovskú stránku Úvodná obrazovka @@ -336,14 +333,8 @@ Teraz nie - - Nastavte si Firefox ako svoj obľúbený prehliadač Radi vás držíme v bezpečí - - Firefox upredňostňuje ľudí pred ziskami a chráni vaše súkromie blokovaním sledovacích prvkov tretích strán.\n\nĎalšie informácie nájdete v našom Vyhlásení o ochrane osobných údajov. Náš neziskový prehliadač pomáha zabrániť spoločnostiam, aby vás tajne sledovali na webe.\n\nĎalšie informácie nájdete v našom Vyhlásení o ochrane osobných údajov. Teraz nie - Preskočte z telefónu na laptop a späť - Pri preskakovaní medzi zariadeniami zostaňte šifrovaní - - Vezmite karty a heslá z ostatných zariadení a pokračujte tam, kde ste prestali. Keď ste prihlásení a synchronizovaní, ste bezpečnejší. Firefox šifruje vaše heslá, záložky a ďalšie položky. @@ -366,15 +353,9 @@ Prihlásiť sa Teraz nie - - Upozornenia vám pomôžu vyťažiť z prehliadača Firefox ešte viac Upozornenia vám pomôžu zostať s Firefoxom v bezpečí - - Posielajte karty medzi zariadeniami, spravujte sťahovanie súborov a získajte tipy, ako prehliadač Firefox využiť čo najlepšie. Bezpečne posielajte karty medzi vašimi zariadeniami a objavte ďalšie funkcie ochrany osobných údajov vo Firefoxe. @@ -414,13 +395,11 @@ O aplikácii - Zvoľte nejaký - - Spravovať skratky vyhľadávania + Zvoľte vyhľadávač - Spravovať alternatívne vyhľadávacie moduly + Spravovať alternatívne vyhľadávače - Upraviť vyhľadávače viditeľné v ponuke vyhľadávania + Upravte si vyhľadávače viditeľné v ponuke vyhľadávania Vyhľadávače viditeľné v ponuke vyhľadávania @@ -431,14 +410,12 @@ Vyhľadávacie moduly Návrhy z vyhľadávačov - - Panel s adresou Predvoľby panela s adresou Panel s adresou – Návrhy Firefoxu - Prečítajte si viac o Návrhoch Firefoxu + Ďalšie informácie o Návrhoch Firefoxu Ohodnoťte aplikáciu v Obchode Play Blokovanie bannerov k súborom cookie - Blokovanie bannerov k súborom cookie v súkromnom prehliadaní + Blokovať bannery k súborom cookie v súkromnom prehliadaní Znižovať počet bannerov k súborom cookie @@ -557,14 +534,10 @@ Je však tiež možné, že ide o útočníka. Ak budete pokračovať na webovú stránku, nemali by ste zadávať žiadne citlivé informácie. Ak budete pokračovať, režim Len HTTPS sa pre túto stránku dočasne vypne. Zjednodušenie ovládania - - Vlastný server pre účet Firefox Vlastný server pre účet Mozilla Vlastný server pre synchronizáciu - - Server pre účet Firefox alebo synchronizáciu bol zmenený. Pre použitie zmien sa teraz aplikácia ukončí… Server pre účet Mozilla alebo synchronizáciu bol zmenený. Pre použitie zmien sa teraz aplikácia ukončí… @@ -582,8 +555,6 @@ Prihláste sa a synchronizujte karty, záložky, heslá a ďalšie položky. - Účet Firefox - Účet Mozilla Pre spustenie synchronizácie sa znova pripojte @@ -595,14 +566,12 @@ Zber údajov Vzdialené ladenie cez USB - - Zobraziť vyhľadávače Zobrazovať návrhy vyhľadávania - Zobraziť hlasové vyhľadávanie + Zobrazovať hlasové vyhľadávanie - Zobraziť v súkromnej relácii + Zobrazovať v súkromnom prehliadaní Navrhovať skopírovaný text @@ -730,12 +699,6 @@ Preskúmať doplnky - - - Doplnok nie je podporovaný - - Doplnok je už nainštalovaný - Doplnky sú dočasne zakázané @@ -856,7 +819,7 @@ - Potiahnutím aktualizujete + Potiahnutím obnoviť Skryť panel s nástrojmi posunutím stránky @@ -1345,7 +1308,7 @@ Prihlásiť sa k službe Sync - Synchronizovať a uložiť údaje + Synchronizácia Odoslať do všetkých zariadení @@ -1374,6 +1337,12 @@ Zavrieť súkromné karty + + + Chcete zatvoriť súkromné karty? + + Ťuknutím alebo potiahnutím tohto upozornenia zatvoríte súkromné karty. + Marketing @@ -1610,6 +1579,8 @@ Všetky cookies (obmedzí fungovanie niektorých stránok) Izolovať súbory cookie tretích strán + + Požiadať webové stránky, aby nezdieľali ani nepredávali moje údaje Sledovací obsah @@ -1825,7 +1796,7 @@ Údaje sú šifrované - Synchronizovať karty naprieč zariadeniami + Synchronizovať platobné karty naprieč zariadeniami Synchronizovať platobné karty @@ -1945,28 +1916,18 @@ Pridať nový vyhľadávač Upraviť vyhľadávač - - Pridať - - Uložiť Upraviť Odstrániť - - Iný Názov - - Názov Názov vyhľadávača Adresa URL vyhľadávacieho reťazca - Výraz vyhľadávania - Adresa URL, ktorá sa má použiť na vyhľadávanie Nahraďte výraz s „%s“. Príklad:\nhttps://www.google.com/search?q=%s @@ -2196,8 +2157,6 @@ - Kontrola recenzií - Kontrola recenzií Spoľahlivé recenzie @@ -2210,7 +2169,9 @@ Upravené hodnotenie - Nespoľahlivé recenzie boli odstránené + Nespoľahlivé recenzie boli odstránené + + Na základe spoľahlivých recenzií To najlepšie z nedávnych recenzií @@ -2221,14 +2182,10 @@ známku od A po F.]]> Spoľahlivé recenzie. Veríme, že recenzie sú pravdepodobne od skutočných zákazníkov, ktorí zanechali úprimné a nezaujaté recenzie. - - Veríme, že recenzie sú spoľahlivé. Myslíme si, že je tu mix spoľahlivých a nespoľahlivých recenzií. Nespoľahlivé recenzie. Sme presvedčení, že recenzie sú pravdepodobne falošné alebo od zaujatých recenzentov. - - Myslíme si, že recenzie sú nespoľahlivé. Upravené hodnotenie je založené iba na recenziách, ktoré považujeme za spoľahlivé.]]> @@ -2244,8 +2201,6 @@ Zobrazovať reklamy v nástroji Kontrola recenzií - Príležitostne sa vám budú zobrazovať reklamy na relevantné produkty. Všetky reklamy musia spĺňať naše štandardy kvality recenzií. %s - Príležitostne sa vám budú zobrazovať reklamy na relevantné produkty. Inzerujeme iba produkty so spoľahlivými recenziami. %s Ďalšie informácie @@ -2268,23 +2223,23 @@ Keď bude mať tento produkt viac recenzií, budeme môcť skontrolovať ich kvalitu. - Produkt nie je dostupný + Produkt nie je dostupný - Ak zistíte, že tento produkt je opäť na sklade, nahláste to a my budeme pracovať na kontrole recenzií. + Ak zistíte, že tento produkt je opäť na sklade, nahláste to a my budeme pracovať na kontrole recenzií. - Oznámiť, že tento produkt je opäť na sklade - - Oznámiť, že produkt je na sklade + Oznámiť, že produkt je na sklade - Kontroluje sa kvalita recenzií + Kontroluje sa kvalita recenzií - Kontroluje sa kvalita recenzií + Kontroluje sa kvalita recenzií + + Kontroluje sa kvalita recenzií (%s) Môže to trvať asi 60 sekúnd. - Ďakujeme za nahlásenie! + Ďakujeme za nahlásenie! - Informácie o recenziách tohto produktu by sme mali mať do 24 hodín. Príďte sa pozrieť. + Informácie o recenziách tohto produktu by sme mali mať do 24 hodín. Príďte sa pozrieť. Tieto recenzie nemôžeme skontrolovať @@ -2323,17 +2278,17 @@ Ďalšie informácie - Výberom možnosti “Áno, vyskúšať” vyjadrujete súhlas s %1$s a %2$s služby %3$s od Mozilly. + Výberom možnosti “Áno, vyskúšať” vyjadrujete súhlas s %1$s a %2$s služby %3$s od Mozilly. - Zvolením možnosti „Áno, vyskúšať“ vyjadrujete súhlas s nasledujúcim dokumentami od %1$s: + Zvolením možnosti „Áno, vyskúšať“ vyjadrujete súhlas s nasledujúcim dokumentami od %1$s: - Zásadami ochrany osobných údajov + Zásadami ochrany osobných údajov - Zásady ochrany osobných údajov + Zásady ochrany osobných údajov - Podmienkami používania + Podmienkami používania - Podmienky používania + Podmienky používania Áno, vyskúšať @@ -2369,6 +2324,9 @@ Konkurencieschopnosť + + “%s” + zbaliť @@ -2386,4 +2344,205 @@ otvorte odkaz a dozviete sa viac %s, nadpis + + + Odkazy + + Dostupné odkazy + + + + + + Preložiť túto stránku? + + Vyskúšajte súkromné preklady v aplikácii %1$s + + Na ochranu vášho súkromia preklady nikdy neopustia vaše zariadenie. Nové jazyky a vylepšenia už čoskoro! %1$s + + Ďalšie informácie + + Preložiť z jazyka + + Preložiť do jazyka + + Teraz nie + + Hotovo + + Preložiť + + Skúste to znova + + Prebieha preklad + + Práve prebieha preklad + + + Pri preklade sa vyskytol problém. Prosím skúste to znova. + + Nepodarilo sa načítať jazyky. Skontrolujte svoje internetové pripojenie a skúste to znova. + + Ľutujeme, jazyk %1$s zatiaľ nepodporujeme. + + Ďalšie informácie + + + + Nastavenia prekladov + + Vždy ponúkať preklad + + Vždy prekladať jazyk %1$s + + Nikdy neprekladať z jazyka %1$s + + Nikdy neprekladať túto stránku + + Nastavenia prekladu + + Informácie o prekladoch v aplikácii %1$s + + + + Preklady + + Ak je to možné, ponúknuť preklad + + Vždy sťahovať jazyky v režime šetrenia dát + + Nastavenia prekladania obsahu + + Automatický preklad + + Nikdy neprekladať tieto stránky + + Stiahnuť jazyky + + + + Automatický preklad + + + Vyberte jazyk, pre ktorý chcete spravovať predvoľby „vždy prekladať“ a „nikdy neprekladať“. + + + + Ponúkať preklad (predvolené) + + %1$s ponúkne preklad stránok v tomto jazyku. + + Vždy prekladať + + + %1$s automaticky preloží tento jazyk pri načítaní stránky. + + Nikdy neprekladať + + %1$s nikdy neponúkne preklad stránok v tomto jazyku. + + + + Nikdy neprekladať tieto stránky + + Ak chcete pridať novú stránku: navštívte ju a v ponuke prekladov vyberte možnosť „Nikdy neprekladať túto stránku“. + + Odstrániť %1$s + + Odstrániť %1$s? + + Odstrániť + + Zrušiť + + + + Stiahnite si jazyky + + Stiahnite si kompletné jazyky pre rýchlejšie preklady a preklady offline. %1$s + + Ďalšie informácie + + Dostupné jazyky + + vyžadovaný + + %1$s (%2$s) + + Stiahnite si jazyky + + Všetky jazyky + + Odstrániť + + Prebieha + + Stiahnuť + + Zvolený + + + Odstrániť %1$s (%2$s)? + + Ak tento jazyk odstránite, %1$s počas prekladania stiahne do vyrovnávacej pamäte len čiastočné údaje pre daný jazyk. + + Odstrániť všetky jazyky (%1$s)? + + Ak odstránite všetky jazyky, %1$s počas prekladania stiahne do vyrovnávacej pamäte len čiastočné údaje daných jazykov. + + Odstrániť + + Zrušiť + + + Stiahnuť potrebné jazykové údaje v režime šetrenia dát (%1$s)? + + Aby boli preklady súkromné, sťahujeme čiastočné údaje pre jazyky do vašej vyrovnávacej pamäte. + + Vždy sťahovať v režime šetrenia dát + + Stiahnuť + + Stiahnuť jazyk a preložiť + + Zrušiť + + + + Nástroje na ladenie + + Prejsť dozadu + + Nástroje pre karty + + Počet kariet + + Aktívne + + Neaktívne + + Súkromné + + Celkovo + + Nástroj na vytváranie kariet + + Počet kariet, ktorý chcete vytvoriť + + Pridať medzi aktívne karty + + Pridať medzi neaktívne karty + + Pridať medzi súkromné karty diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index 472cd30ad664..82eaa74854e9 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -301,13 +301,6 @@ ہݨ کائناں - - - فائرفوکس کوں آپݨاں ون٘ڄݨ آلا براؤزر بݨاؤ - - فائرفوکس لوکاں کوں منافع کنوں ودھ رکھیندا ہے تے کراس سائٹ ٹریکراں کوں بلاک کر تے تہاݙی رازداری دا دفاع کریند ہے۔\n\nساݙے رازداری نوٹس وچ ٻیا ڄاݨو۔ رازداری نوٹس @@ -315,20 +308,10 @@ پہلوں مقرر براؤز تے طور تے سیٹ کرو ہݨ کائناں - - فون سیٹ کنوں لیپ ٹاپ تے ہاپ کرو تے ولدا واپس وی - - تساں آپݨیاں ٻیاں ݙیوائساں نال ٹیباں تے پاس ورڈ گھنو، جتھوں تساں چھوڑیا ہائی۔ سائن ان ہݨ کائناں - - اطلاع نامے فائرفوکس نال ودھیک کرݨ وچ تہاݙی مدد کریندن۔ - - ڈیوائساں دے درمیان ٹیباں بھیڄو، ڈاؤن لوڈ منیج کرو، تے فائرفوکس کنوں ودھ کنوں ودھ فائدہ چاوݨ کیتے گُر گھنو۔ اطلاع نامے چالو کرو @@ -360,16 +343,12 @@ تعارف ہک چݨو - - ڳولݨ شارٹ کٹ منیج کرو طےشدہ ڳولݨ انجݨ ڳولو ڳولݨ انجݨ - - پتہ پٹی گوگل پلے تے ریٹ رسائیت - - منپسند فائرفوکس کھاتہ سرور من پسند ہم وقت سرور - - فائرفوکس کھاتہ/ہم وقت سرور دی تجدید تھی ڳئی ہے۔ تبدیلیان لاگو کرݨ کیتے ایپ چھوڑیندے پئے ہو۔۔۔ کھاتہ @@ -490,7 +465,7 @@ ٹیباں، نشانیاں، پاس ورڈ تے ٻیا ٻہوں کجھ ہم وقت کرݨ کیتے سائن ان تھیوو۔ - فائرفوکس کھاتہ + Mozilla کھاتہ ہم وقت کرݨ کوں ولدا شروع کرݨ کیتے ولدا کنکٹ کرو @@ -502,8 +477,6 @@ ڈیٹا مجموعہ یوایس بی دے ذریعے بعید ٹھیک کاری - - ڳولݨ انجݨ ݙکھاؤ ڳولݨ تجویزاں ݙکھاؤ @@ -613,12 +586,6 @@ ٻئے وال پیپر پھلورو - - - ایڈ ــ آن سہارا تھیا کائنی - - ایڈ ــ آن پہلے ہی انسٹال تھیا ہویا ہے - کھاتہ منیج کرو @@ -1247,6 +1214,7 @@ نجی ٹیباں بند کرو + مارکیٹنگ @@ -1820,29 +1788,19 @@ نواں ڳولݨ انجݨ شامل کرو ڳولݨ انجݨ وچ تبدیلی کرو - - شامل کرو - - محفوظ تبدیلی کرو مٹاؤ - - ٻیا ناں - - ناں ڳولݨ انجݨ ناں تند یوآرایل ڳولو - ورتݨ کیتے تند ڳولو - ڳولݨ دے ورتݨ کیتے یوآرایل “%s” نال سوال وٹاؤ۔ @@ -2074,19 +2032,25 @@ ٻیا سِکھو - رازداری پالیسی + رازداری پالیسی - رازداری پالیسی + رازداری پالیسی - ورتݨ شرطاں + ورتݨ شرطاں - ورتݨ شرطاں + ورتݨ شرطاں جیا، ایں کوں ازماؤ ہݨ کائناں + + ریویو پڑتالی کھولو Beta + + ریویو پڑتالی کھولو + + ریویو پڑتالی بند کرو گھٹ ݙکھاؤ @@ -2099,6 +2063,9 @@ شِپنگ + + “%s” + کٹھا کرو @@ -2112,4 +2079,79 @@ مضمون پڑھو ٻیا سکھݨ کیتے لنک کھولو - + + + + + ٻیا سِکھو + + کنوں ترجمہ کرو + + وچ ترجمہ کرو + + ہݨ کائناں + + تھی ڳیا + + ترجمہ کرو + + ولدا کوشش کرو + + ٻیا سِکھو + + + + ترجمے + + ترجمے دیاں ترجیحاں + + + %1$s مٹاؤں؟ + + مٹاؤ + + منسوخ + + + ٻیا سِکھو + + دستیاب زباناں + + مطلوبہ + + %1$s (%2$s) + + ساریاں زباناں + + مٹاؤ + + تھیندیاں پیاں + + ڈاؤن لوڈ + + چُݨا ہویا + + + مٹاؤ + + منسوخ + + + ڈاؤن لوڈ + + ڈاؤن لوڈ کرو تے ترجمہ کرو + + منسوخ + + + فعال + + غیر فعال + + نجی + + کل + diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 8b8c7f916bfd..950cde5c8bbb 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -70,11 +70,6 @@ Ne pustite sledi na tej napravi - - Ko zaprete vsa zasebna okna, %1$s izbriše piškotke, zgodovino in podatke o spletnih mestih. %2$s Najdi na strani + + Prevedi stran Shrani v zbirko @@ -331,14 +328,8 @@ Ne zdaj - - Naj bo Firefox vaš brskalnik za vsakodnevna opravila Z veseljem skrbimo za vašo varnost - - Firefox daje ljudem prednost pred dobičkom in ščiti vašo zasebnost, tako da zavrača medspletne sledilce.\n\nPreberite več v našem obvestilu o zasebnosti. Naš neprofitni brskalnik pomaga podjetjem preprečiti, da bi vam na skrivaj sledila po spletu.\n\nVeč o tem v našem pravilniku o zasebnosti. Ne zdaj - Skočite s telefona na računalnik in nazaj - Ostanite šifrirani pri skakanju z naprave na napravo - - Zajemite zavihke in gesla iz drugih naprav, da nadaljujete tam, kjer ste končali. Prijavljeni in sinhronizirani ste varnejši. Firefox šifrira vaša gesla, zaznamke in ostale podatke. @@ -361,15 +348,9 @@ Prijava Ne zdaj - - Obvestila vam pomagajo pri delu s Firefoxom Obvestila vam pomagajo, da ostanete varni v Firefoxu - - Pošiljajte zavihke med napravami, upravljajte prenose in prejemajte nasvete, kako kar najbolje izkoristiti Firefox. Varno pošiljajte zavihke z ene naprave na drugo in odkrijte druge možnosti za zasebnost, ki jih ponuja Firefox. @@ -412,8 +393,6 @@ Izberite enega - Upravljanje bližnjic za iskanje - Upravljaj pomožne iskalnike Uredi iskalnike, vidne v iskalnem meniju @@ -427,8 +406,6 @@ Iskalnike Predlogi iskalnikov - - Naslovna vrstica Nastavitve naslovne vrstice @@ -549,14 +526,10 @@ Vendar pa je možno tudi, da je vpleten napadalec. Če se odločite nadaljevati na spletno stran, ne vnašajte nikakršnih občutljivih podatkov. Če nadaljujete, bo način samo HTTPS za spletno mesto začasno izklopljen. Dostopnost - - Strežnik Firefox računov po meri Strežnik računov Mozilla po meri Sinhronizacijski strežnik po meri - - Strežnik Firefox Računa/Synca je spremenjen. Zapiranje aplikacije za uveljavitev sprememb … Strežnik računa Mozilla/sinhronizacije je spremenjen. Zapiranje aplikacije za uveljavitev sprememb … @@ -574,8 +547,6 @@ Prijavite se in sinhronizirajte zavihke, zaznamke, gesla in še kaj. - Firefox Račun - Račun Mozilla Ponovno se povežite za nadaljevanje sinhronizacije @@ -587,8 +558,6 @@ Zbiranje podatkov Oddaljeno razhroščevanje preko USB - - Prikaži iskalnike Prikaži predloge iskanja @@ -722,12 +691,6 @@ Razišči dodatke - - - Dodatek ni podprt - - Dodatek je že nameščen - Dodatki so začasno onemogočeni @@ -1370,6 +1333,7 @@ Zapri zasebne zavihke + Trženje @@ -1610,6 +1574,8 @@ Vse piškotke (povzroči nedelovanje spletnih strani) Izolirajte medspletne piškotke + + Spletnim mestom sporočaj, naj ne prodajajo ali delijo podatkov Sledilno vsebino @@ -1954,28 +1920,18 @@ Dodaj nov iskalnik Urejanje iskalnika - - Dodaj - - Shrani Uredi Izbriši - - Drugo Ime - - Ime Ime iskalnika URL iskalnega niza - Iskalni niz za uporabo - URL za uporabo pri iskanju Zamenjajte poizvedbo z "%s". Primer: \nhttps://www.google.com/search?q=%s @@ -2209,8 +2165,6 @@ - Pregledovalnik mnenj - Pregledovalnik mnenj Zanesljiva mnenja @@ -2223,7 +2177,7 @@ Prilagojena ocena - Nezanesljiva mnenja odstranjena + Nezanesljiva mnenja odstranjena Poudarki iz nedavnih mnenj @@ -2234,14 +2188,10 @@ črkovno oceno od A do F.]]> Zanesljiva mnenja. Verjamemo, da so jih napisale resnične stranke, ki so pustile poštene in nepristranske ocene. - - Menimo, da so mnenja zanesljiva. Menimo, da obstaja mešanica zanesljivih in nezanesljivih mnenj. Nezanesljiva mnenja. Menimo, da so verjetno lažna ali pa so jih napisali pristranski ocenjevalci. - - Menimo, da so mnenja nezanesljive. Prilagojena ocena temelji samo na mnenjih, za katere menimo, da so zanesljiva.]]> @@ -2257,8 +2207,6 @@ Prikaži oglase v pregledovalniku mnenj - Občasno boste videli oglase za primerne izdelke. Vsi oglasi morajo izpolnjevati naše standarde kakovosti mnenj. %s - Občasno boste videli oglase za primerne izdelke. Oglašujemo samo izdelke z zanesljivimi mnenji. %s Več o tem @@ -2281,23 +2229,21 @@ Ko bo za ta izdelek na voljo več mnenj, bomo lahko preverili njihovo kakovost. - Izdelek ni na voljo + Izdelek ni na voljo - Če opazite, da je izdelek znova na zalogi, nam to sporočite in preverili bomo mnenja. - - Sporoči, da je izdelek znova na zalogi + Če opazite, da je izdelek znova na zalogi, nam to sporočite in preverili bomo mnenja. - Sporoči, da je izdelek znova na zalogi + Sporoči, da je izdelek znova na zalogi - Preverjanje kakovosti mnenj + Preverjanje kakovosti mnenj - Preverjanje kakovosti mnenj + Preverjanje kakovosti mnenj To lahko traja približno 60 sekund. - Hvala za sporočilo! + Hvala za sporočilo! - Podatki o mnenjih za ta izdelek bi morali biti pripravljeni v 24 urah. Preverite znova kasneje. + Podatki o mnenjih za ta izdelek bi morali biti pripravljeni v 24 urah. Preverite znova kasneje. Teh mnenj ne moremo preveriti @@ -2335,17 +2281,17 @@ Več o tem - Z izbiro “Da, poskusi” se strinjate z %2$s in %3$s Mozilla %1$s. + Z izbiro “Da, poskusi” se strinjate z %2$s in %3$s Mozilla %1$s. - Z izbiro “Da, poskusi” se strinjate z naslednjimi dokumenti %1$sa: + Z izbiro “Da, poskusi” se strinjate z naslednjimi dokumenti %1$sa: - pravilnikom o zasebnosti + pravilnikom o zasebnosti - Pravilnik o zasebnosti + Pravilnik o zasebnosti - pogoji uporabe + pogoji uporabe - Pogoji uporabe + Pogoji uporabe Da, poskusi @@ -2382,6 +2328,9 @@ Konkurenčnost + + "%s" + strnete @@ -2399,4 +2348,133 @@ odprete povezavo s podrobnostmi %s, naslov - + + + Povezave + + + Na voljo so povezave + + + + + + Prevedem to stran? + + Preskusite zasebno prevajanje v %1$su + + Zasebnost je zagotovljena, saj prevodi nikoli ne zapustijo vašega računalnika. Novi jeziki in izboljšave so na poti! %1$s + + Več o tem + + Izvorni jezik + + Ciljni jezik + + Ne zdaj + + Končano + + Prevedi + + Poskusi znova + + Prevajanje + + Prevajanje poteka + + + Pri prevajanju je prišlo do težave. Poskusite znova. + + Jezikov ni bilo mogoče naložiti. Preverite internetno povezavo in poskusite znova. + + %1$s žal še ni podprt jezik. + + Več o tem + + + + Možnosti prevajanja + + Vedno ponudi prevod + + + Vedno prevedi jezik %1$s + + Nikoli ne prevajaj jezika %1$s + + Nikoli ne prevajaj tega spletnega mesta + + Nastavitve prevajanja + + O prevodih v %1$su + + + + Prevajanje + + Ponudi prevajanje, ko je to mogoče + + Vedno prenesi jezike tudi ob varčevanju s podatki + + Nastavitve prevajanja + + + Samodejno prevajanje + + Nikoli ne prevajaj teh spletnih mest + + Prenesi jezike + + + + Samodejno prevajanje + + + Vedno prevedi + + %1$s naj samodejno prevede ta jezik, ko se stran naloži. + + Nikoli ne prevajaj + + + %1$s naj nikoli ne ponuja prevoda strani v tem jeziku. + + + + Nikoli ne prevajaj teh spletnih mest + + Izbriši + + Prekliči + + + Več o tem + + Jeziki na razpolago + + potrebno + + %1$s (%2$s) + + Vsi jeziki + + Izbriši + + V teku + + Prenesi + + Izbrano + + + Izbriši + + Prekliči + + + Prekliči + + diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 6b4c2dc94d51..bef8a1c2b1d1 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -60,7 +60,7 @@ - %1$s e spastron historikun tuaj të kërkimeve dhe shfletimit prej skedash private, kur i mbyllni ato, ose dilni nga aplikacioni. Edhe pse kjo s’ju bën anonim përballë sajteve apo furnizuesit të shërbimit tuaj internet, e bën më të lehtë mbajtjen private të asaj çka bëni në internet, nga cilido tjetër që përdor këtë pajisje. + %1$s-u e spastron historikun tuaj të kërkimeve dhe shfletimit prej skedash private, kur i mbyllni ato, ose dilni nga aplikacioni. Edhe pse kjo s’ju bën anonim përballë sajteve apo furnizuesit të shërbimit tuaj internet, e bën më të lehtë mbajtjen private të asaj çka bëni në internet, nga cilido tjetër që përdor këtë pajisje. Mite të rëndomtë mbi shfletimin privat @@ -68,11 +68,6 @@ Mos lini gjurmë në këtë pajisje - - %1$s fshin cookie-t, historikun dhe të dhëna sajti tuajat, kur mbyllni krejt dritaret tuaja private. %2$s - Veçoria jonë më e fuqishme deri sot për privatësinë izolon gjurmues që ndjekin nga sajti në sajt. + Veçoria jonë më e fuqishme deri sot për privatësinë izolon gjurmues që ndjekin nga sajte në sajte. Mësoni mbi Mbrojtje Tërësore Nga Cookie-t @@ -215,6 +210,8 @@ Rinjëkohëso Gjej në faqe + + Përktheje faqen Ruaje në koleksion @@ -287,7 +284,7 @@ Rregullime mbi kërkimin - Këtë herë kërko te: + Këtë herë kërko me: Motor kërkimesh %s @@ -327,14 +324,8 @@ Jo tani - - Bëjeni Firefox-in shfletuesin tuaj të zemrës Duam fort t’ju mbajmë të parrezik - - Firefox-i vë njerëzit mbi fitimet dhe mbron privatësinë tuaj duke bllokuar gjurmues “nga sajti në sajt”.\n\nMësoni më tepër te shënimi ynë mbi privatësinë. Shfletuesi ynë, me entin jofitimprurës nga pas, ndihmon të ndalen shoqëri t’ju ndjekin fshehtazi nëpër internet.\n\nMësoni më tepër te shënimi ynë mbi privatësinë. Jo tani - - Kaloni nga telefoni në portativ, ose anasjelltas Jini i fshehtëzuar, kur hidheni nga një pajisje në tjetrën - - Merrni skeda dhe fjalëkalime nga pajisjet tuaja të tjera, për të vazhduar atje ku e latë. Kur keni bërë hyrjen në llogari dhe njëkohësim, jeni më të siguruar. Firefox-i fshehtëzon fjalëkalimet tuaja, faqerojtësit, etj. @@ -358,15 +345,9 @@ Hyni Jo tani - - Njoftimet ju ndihmojnë të arrini më tepër gjëra me Firefox-in Njoftimet ju ndihmojnë të jini më të parrezik në Firefox - - Dërgoni skeda nga pajisje në pajisje, administroni shkarkime dhe merrni ndihmëza se si të përfitoni maksimumin nga Firefox-i. Dërgoni në mënyrë të siguruar skeda mes pajisjeve tuaja dhe zbuloni veçori të reja privatësie në Firefox. @@ -380,7 +361,7 @@ Provoni widget-in e kërkimeve të Firefox-it - Me Firefox-in te skena juaj e kreut do të mund të përdorni kollaj shfletuesin që vë privatësinë së pari, që bllokon gjurmues të llojit “nga sajti në sajt”. + Me Firefox-in te skena juaj e kreut do të mund të përdorni kollaj shfletuesin që vë privatësinë së pari, që bllokon gjurmues të llojit “nga sajte në sajte”. Shtoni “widget” Firefox-i @@ -409,8 +390,6 @@ Përzgjidhni një - Administroni shkurtore kërkimi - Administroni motorë alternativë kërkimesh Përpunoni dukshmëri motorësh te menuja e kërkimeve @@ -424,8 +403,6 @@ Motorë kërkimesh Sugjerime prej motorësh kërkimi - - Shtyllë adresash Parapëlqime shtylle adresash @@ -436,7 +413,7 @@ Vlerësojeni në Google Play - Mbi %1$s-in + Mbi %1$s-un Caktojeni shfletuesin parazgjedhje @@ -452,7 +429,7 @@ Lejo foto ekrani nën shfletim privat - Në u lejoftë, skedat private do të jenë të dukshme edhe kur janë hapur aplikacione të shumtë + Në u lejoftë, skedat private do të jenë të dukshme edhe kur janë të hapur aplikacione të shumtë Shtoni shkurtore shfletimi privat @@ -548,14 +525,10 @@ Por, është gjithashtu e mundshme që të jetë dora e ndonjë agresori. Nëse vazhdoni te sajti, s’duhet të jepni ndonjë të dhënë rezervat. Nëse vazhdoni, mënyra Vetëm-HTTPS do të çaktivizohet përkohësisht për sajtin. Përdorim nga persona me aftësi të kufizuara - - Shërbyes vetjak Llogarish Firefox Shërbyes vetjak llogarish Mozilla Shërbyes vetjak Sync - - Shërbyesi Llogari Firefox/Sync u ndryshua. Po dilet nga aplikacioni për të zbatuar ndryshimet… U ndryshua llogari Mozilla/shërbyes Njëkohësimesh. Po mbyllet aplikacioni, për të aplikuar ndryshimet… @@ -573,8 +546,6 @@ Bëni hyrjen, që të njëkohësoni skeda, faqerojtës, fjalëkalime, etj. - Llogari Firefox - Llogari Mozilla Rilidhuni për të vazhduar njëkohësimin @@ -586,8 +557,6 @@ Grumbullim të dhënash Diagnostikim së largëti përmes USB-je - - Shfaq motorë kërkimi Shfaq sugjerime kërkimi @@ -610,7 +579,7 @@ Sugjerime nga sponsorë - Përkrahni %1$s-in, përmes sugjerimesh, të ndonjëherëshme, të sponsorizuara + Përkrahni %1$s-un, përmes sugjerimesh, të ndonjëherëshme, të sponsorizuara Sugjerime nga %1$s @@ -642,9 +611,9 @@ Njoftime - E lejuar + Të lejuar - E palejuar + Nuk lejohen @@ -719,17 +688,11 @@ Eksploroni shtesa - - - Shtesa nuk mbulohet - - Shtesa është tashmë e instaluar - Shtesat janë çaktivizuar përkohësisht - Një ose më tepër shtesa reshtën së funksionuari, duke e bërë të paqëndrueshëm sistemin tuaj. %1$s-i u rrek, pa sukses, të rinisë shtesën(at).\n\nShtesat s’do të rinisen gjatë sesionit tuaj të tanishëm.\n\nHeqja, ose çaktivizimi i shtesave mund ta ndreqë këtë problem. + Një ose më tepër shtesa reshtën së funksionuari, duke e bërë të paqëndrueshëm sistemin tuaj. %1$s-u u rrek, pa sukses, të rinisë shtesën(at).\n\nShtesat s’do të rinisen gjatë sesionit tuaj të tanishëm.\n\nHeqja, ose çaktivizimi i shtesave mund ta ndreqë këtë problem. Provoni të rinisni shtesa @@ -803,7 +766,7 @@ Të dhëna përdorimi dhe teknike - I jep Mozilla-s të dhëna rreth funksionimit, përdorimit, hardware-it dhe përshtatjeve të shfletuesit tuaj, për ta ndihmuar në përmirësimin e %1$s-it + I jep Mozilla-s të dhëna rreth funksionimit, përdorimit, hardware-it dhe përshtatjeve të shfletuesit tuaj, për ta ndihmuar në përmirësimin e %1$s-ut Të dhëna marketingu @@ -930,7 +893,7 @@ - Skenën hyrëse + Skenë hyrëse Faqen hyrëse @@ -938,7 +901,7 @@ Faqe hyrëse pas katër orësh plogështie - Mbylleni dorazi + Mbyllini dorazi Mbylle pas një dite @@ -1464,7 +1427,7 @@ number of history items the user has --> %d adresa - Cookies dhe të dhëna sajtesh + “Cookies” dhe të dhëna sajtesh Do të bëhet dalja juaj nga shumica e sajteve @@ -1481,7 +1444,7 @@ Fshi të dhëna shfletimi gjatë daljes - Fshin automatikisht të dhënat e shfletimit, kur përzgjidhni \“Dil\” nga menuja kryesore + Fshin automatikisht të dhënat e shfletimit, kur përzgjidhni “Dil” nga menuja kryesore Dil @@ -1561,7 +1524,7 @@ Mbrojtje e Thelluar Nga Gjurmimi - Tashmë me Mbrojtje Tërësore Nga Cookie-t, barriera jonë më e fuqishme deri më sot kundër gjurmuesve nga sajti në sajt. + Tashmë me Mbrojtje Tërësore Nga Cookie-t, barriera jonë më e fuqishme deri më sot kundër gjurmuesve nga sajte në sajte. %s ju mbron nga shumë prej gjurmuesve më të rëndomtë që ndjekin ç’bëni në internet. @@ -1586,17 +1549,19 @@ Ç’bllokohet nga mbrojtje vetjake kundër gjurmimit - Cookies + “Cookies” Gjurmues nga sajte në sajte dhe mediash shoqërore - Cookies nga sajte të pavizituar + “Cookies” nga sajte të pavizituar Krejt cookie-t nga palë të treta (mund të shkaktojë mosfunksionim të disa sajteve) Krejt cookie-t (do të shkaktojë mosfunksionim sajtesh) Izoloni “cookies” palësh të treta + + Thuaju sajteve të mos shesin & japin të dhëna Lëndë gjurmimi @@ -1610,7 +1575,7 @@ Hollësi - Të bllokuara + Të bllokuar Të lejuara @@ -1618,21 +1583,21 @@ Kufizon aftësinë e rrjeteve shoqërorë të gjurmojnë nëpër internet veprimtarinë tuaj të shfletimit. - <em>Cookies</em> Gjurmimi Nga Sajte Në Sajte + ”Cookies” Gjurmimi Nga Sajte Në Sajte “Cookies” Nga Palë të Treta - Bllokon <em>cookies</em> të cilat rrjete reklamash dhe shoqëri analizimesh i përdorin për të përpiluar të dhëna tuajat të shfletimit nëpër mjaft sajte. + Bllokon ”cookies” të cilat rrjete reklamash dhe shoqëri analizimesh i përdorin për të përpiluar të dhëna tuajat të shfletimit nëpër mjaft sajte. Mbrojtja Tërësore Nga Cookie-t i izolon “cookies” te sajti ku gjendeni, që gjurmuesit të mos i përdorin dot për t’ju ndjekur nga një sajt te tjetri. Nxjerrës kriptomonedhash - Parandalon hyrjen në pajisjen tuaj të programtheve dashakeqe për qëllime nxjerrje monedhe dixhitale. + Parandalon hyrjen në pajisjen tuaj të programtheve dashakeqe për qëllime nxjerrje monedhash dixhitale. - Krijues shenja gishtash + Krijues shenjash gishtash - Ndal grumbullim të dhënash që lejojnë identifikim unik rreth pajisjes tuaj, që mund të përdoren për qëllime gjurmimi. + Ndalon grumbullim të dhënash që lejojnë identifikim unik rreth pajisjes tuaj, të cilat mund të përdoren për qëllime gjurmimi. Lëndë Gjurmimi @@ -1656,7 +1621,7 @@ Gjurmues Ridrejtimesh - Spastron cookies të depozituara nga ridrejtime për te sajte të njohur për gjurmim. + Spastron “cookies” të depozituara nga ridrejtime për te sajte të ditur se gjurmojnë. @@ -1811,7 +1776,7 @@ Karta krediti - Ruaj dhe plotësoni vetvetiu të dhëna kartash + Ruaj dhe plotëso vetvetiu të dhëna kartash Të dhënat janë të fshehtëzuara @@ -1934,28 +1899,18 @@ Shtoni motor të ri kërkimesh Përpunoni motor kërkimesh - - Shtoje - - Ruaje Përpunoni Fshije - - Tjetër Emër - - Emër Emër motori kërkimesh URL vargu kërkimi - Varg kërkimi për t’u përdorur - URL për t’u përdorur për kërkim Zëvendësoni kërkesën me “%s”. Shembull:\nhttps://www.google.com/search?q=%s @@ -1997,7 +1952,7 @@ %1$s si ON]]> - Lidhja është e sigurt + Lidhja është e siguruar Lidhja s’është e sigurt @@ -2185,8 +2140,6 @@ - Kontrollor shqyrtimesh - Kontrollor Shqyrtimesh Shqyrtime të besueshme @@ -2199,7 +2152,9 @@ Vlerësim i rregulluar - U hoqën shqyrtime jo të besueshme + U hoqën shqyrtime jo të besueshme + + Bazuar në shqyrtime të besueshme Gjëra në pah nga shqyrtimet së fundi @@ -2211,14 +2166,10 @@ vlerësim me shkronjë nga A në F.]]> Shqyrtime të vlefshme. Besojmë se shqyrtimet janë, me gjasa, prej klientësh të njëmendtë, që lanë shqyrtime të ndershme, të paanshme. - - Besojmë se shqyrtimeve mund t’u zihet besë. Besojmë se bëhet fjalë për një përzierje shqyrtimesh të besueshme dhe jo të besueshme. Shqyrtime jo të besueshme. Besojmë se shqyrtimet ka gjasa të jenë të rreme, ose prej shqyrtuesish të anshëm. - - Besojmë se shqyrtimeve s’mund t’u zihet besë. Vlerësimi i rregulluar bazohet vetëm në shqyrtime që besojmë se janë të besueshme.]]> @@ -2234,8 +2185,6 @@ Shfaq reklama te kontrollori i shqyrtimeve - Do të shihni, me raste, reklama për produkte të ngjashëm. Krejt reklamat duhet të plotësojnë standardet tona të cilësisë së shqyrtimeve. %s - Do të shihni, me raste, reklama për produkte të ngjashëm. Bëjmë reklamë vetëm për produkte me shqyrtime të besueshme. %s Mësoni më tepër @@ -2258,23 +2207,23 @@ Kur ky produkt të ketë më tepër shqyrtime, do të jemi në gjendje të kontrollojmë cilësinë e tyre. - Produkti s’është i passhëm + Produkti s’është i passhëm - Nëse e shihni sërish në stok këtë produkt, raportojeni dhe do të merremi me kontrollin e shqyrtimeve. - - Njoftoni se për këtë produkt ka prapë stok + Nëse e shihni sërish në stok këtë produkt, raportojeni dhe do të merremi me kontrollin e shqyrtimeve. - Njoftoni se për produktin ka prapë stok + Njoftoni se për produktin ka prapë stok - Kontroll cilësie shqyrtimesh + Kontroll cilësie shqyrtimesh - Po kontrollohet cilësi shqyrtimesh + Po kontrollohet cilësi shqyrtimesh + + Po kontrollohet cilësi shqyrtimesh (%s) Kjo mund të zgjasë rreth 60 sekonda. - Faleminderit për raportimin! + Faleminderit për raportimin! - Brenda 24 orësh do të duhet të kemi informacion rreth shqyrtimeve të këtij produkti. Ju lutemi, rikontrolloni më vonë. + Brenda 24 orësh do të duhet të kemi informacion rreth shqyrtimeve të këtij produkti. Ju lutemi, rikontrolloni më vonë. S’mund t’i kontrollojmë këto shqyrtime @@ -2312,17 +2261,17 @@ Mësoni më tepër - Duke përzgjedhur “Po, Provojeni”, pajtoheni me %1$s nga %2$s dhe %3$s të Mozilla-s. + Duke përzgjedhur “Po, Provojeni”, pajtoheni me %1$s nga %2$s dhe %3$s të Mozilla-s. - Duke përzgjedhur “Po, provojeni”, pajtoheni me sa vijon prej %1$s: + Duke përzgjedhur “Po, provojeni”, pajtoheni me sa vijon prej %1$s: - rregulla privatësie + rregulla privatësie - Rregulla privatësie + Rregulla privatësie - kushte përdorimi + kushte përdorimi - Kushte përdorimi + Kushte përdorimi Po, provojeni @@ -2358,6 +2307,9 @@ Konkurrencë + + “%s” + tkurre @@ -2375,4 +2327,205 @@ që të mësoni më tepër, hapni lidhjen %s, Krye + + + Lidhje + + Ka lidhje + + + + + + Të përkthehet kjo faqe? + + + Provoni përkthime private në %1$s + + Për privatësinë tuaj, përkthimet nuk dalin kurrë jashtë pajisjes tuaj. Së shpejti vijnë gjuhë të reja dhe përmirësime! %1$s + + Mësoni më tepër + + Përkthe nga + + Përkthe në + + Jo tani + + U bë + + Përktheje + + Riprovoni + + Po përkthehet + + Përkthim Në Kryerje e Sipër + + + Pati një problem me përkthimin. Ju lutemi, riprovoni. + + S’u ngarkuan dot gjuhë. Kontrolloni lidhjen tuaj internet dhe riprovoni. + + Na ndjeni, s’e mbulojmë ende %1$s. + + Mësoni më tepër + + + + Mundësi Përkthimi + + Ofro përherë përkthim + + Nga %1$s përkthe përherë + + Mos përkthe kurrë në %1$s + + Mos e përkthe kurrë këtë sajt + + Rregullime përkthimi + + Mbi përkthime në %1$s + + + + Përkthime + + Ofro përkthim, kur mundet + + + Nën mënyrën ruajtje të dhënash, shkarko përherë gjuhë + + Parapëlqime përkthimi + + Përkthim i automatizuar + + Mos i përkthe kurrë këta sajte + + Shkarko gjuhë + + + + Përkthim i automatizuar + + + Që të administroni parapëlqimet ”përkthe përherë“ dhe ”mos përkthe kurrë“, përzgjidhni një gjuhë. + + + + Ofro përkthim (parazgjedhje) + + %1$s-u do të ofrojë të përkthejë sajte në këtë gjuhë. + + Përkthe përherë + + + %1$s-u do ta përkthejë përherë automatikisht këtë gjuhë, kur ngarkohet faqja. + + Mos përkthe kurrë + + %1$s-u s’do të ofrojë kurrë të përkthejë sajte në këtë gjuhë. + + + + Mos i përkthe kurrë këta sajte + + Që të shtohet një sajt i ri: Vizitojeni dhe përzgjidhni “Këtë sajt mos e përkthe kurrë”, që nga menuja e përkthimit. + + Hiqe %1$s + + Të fshihet %1$s? + + Fshije + + Anuloje + + + + Shkarko Gjuhë + + Shkarkoni gjuhë të plota, për përkthim më të shpejtë dhe përkthim jashtë linje. %1$s + + Mësoni më tepër + + Gjuhë të gatshme + + e domosdoshme + + %1$s (%2$s) + + Shkarko Gjuhë + + Krejt gjuhët + + Fshije + + Në punë e sipër + + Shkarkoje + + E përzgjedhur + + + Të fshihet %1$s (%2$s)? + + Nëse e fshini këtë gjuhë, %1$s do të shkarkojë në fshehtinën tuaj gjuhë të pjesshme, teksa përktheni. + + Të fshihen krejt gjuhët (%1$s)? + + Nëse fshini krejt gjuhët, %1$s do të shkarkojë në fshehtinën tuaj gjuhë të pjesshme, teksa përktheni. + + Fshije + + Anuloje + + + Të shkarkohet, edhe pse nën mënyrën ruajtje të dhënash (%1$s)? + + Për t’i mbajtur private përkthimet tuaja, shkarkojmë në fshehtinën tuaj gjuhë të pjesshme. + + Nën mënyrën ruajtje të dhënash, shkarko përherë + + Shkarkoje + + Shkarkoje dhe përktheje + + Anuloje + + + + Mjete Diagnostikim + + Mjete Skedash + + Numër skedash + + Aktive + + Joaktive + + Private + + Gjithsej + + Mjet krijimi skedash + + Sasi skedash për t’u krijuar + + Shtoje te skeda aktive + + Shtoje te skeda joaktive + + Shtoje te skeda private diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 3a7df1b570b7..ffb8bc0e6770 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -69,11 +69,6 @@ Lämna inga spår på den här enheten - - %1$s tar bort dina kakor, historik och webbplatsdata när du stänger alla dina privata fönster. %2$s Hitta på sidan + + Översätt sida Spara i samling @@ -336,14 +333,8 @@ Inte nu - - Gör Firefox till din favoritwebbläsare Vi älskar att hålla dig säker - - Firefox sätter människor före vinster och försvarar din integritet genom att blockera spårare på flera webbplatser.\n\nLäs mer i vårt sekretessmeddelande. Vår icke-vinstdrivande webbläsare hjälper till att hindra företag från att följa dig i hemlighet på webben.\n\nLäs mer i vårt sekretessmeddelande. Inte nu - Hoppa från telefon till laptop och tillbaka - Håll dig krypterad när du byter enhet - - Hämta flikar och lösenord från dina andra enheter för att fortsätta där du slutade. När du är inloggad och synkroniserad är du säkrare. Firefox krypterar dina lösenord, bokmärken och mer. @@ -367,15 +354,9 @@ Logga in Inte nu - - Aviseringar hjälper dig att göra mer med Firefox Aviseringar hjälper dig att vara säkrare med Firefox - - Skicka flikar mellan enheter, hantera nedladdningar och få tips om hur du får ut det mesta av Firefox. Skicka flikar säkert mellan dina enheter och upptäck andra sekretessfunktioner i Firefox. @@ -417,8 +398,6 @@ Välj en - Hantera sökgenvägar - Hantera alternativa sökmotorer Redigera motorer som är synliga i sökmenyn @@ -432,8 +411,6 @@ Sökmotorer Förslag från sökmotorer - - Adressfält Inställningar för adressfältet @@ -555,14 +532,10 @@ Men det är också möjligt att en angripare är inblandad. Om du fortsätter till webbplatsen ska du inte ange någon känslig information. Om du fortsätter kommer endast HTTPS-läget att stängas av tillfälligt för webbplatsen. Hjälpmedel - - Anpassad server för Firefox-konto Anpassad Mozilla-kontoserver Anpassad synkroniseringsserver - - Firefox-konto/synkroniseringsserver ändrad. Avsluta applikationen för att tillämpa ändringar… Mozilla-konto/synkroniseringsserver har ändrats. Avslutar programmet för att tillämpa ändringar… @@ -580,8 +553,6 @@ Logga in för att synkronisera flikar, bokmärken, lösenord och mer. - Firefox-konto - Mozilla-konto Anslut igen för att återuppta synkroniseringen @@ -593,8 +564,6 @@ Datainsamling Fjärrfelsökning via USB - - Visa sökmotorer Visa sökförslag @@ -728,12 +697,6 @@ Utforska tillägg - - - Tillägg stöds inte - - Tillägget är redan installerat - Tillägg är tillfälligt inaktiverade @@ -1375,6 +1338,12 @@ Stäng privata flikar + + + Stäng privata flikar? + + Tryck eller dra den här aviseringen för att stänga privata flikar. + Marknadsföring @@ -1614,6 +1583,8 @@ Alla kakor (kommer att orsaka fel på webbplatser) Isolera globala spårningskakor + + Säg till webbplatser att inte dela och sälja data Spårningsinnehåll @@ -1951,28 +1922,18 @@ Lägg till ny sökmotor Redigera sökmotor - - Lägg till - - Spara Redigera Ta bort - - Andra Namn - - Namn Sökmotorns namn Söksträngs-URL - Söksträng som ska användas - URL att använda för sökning Byt ut frågan med “%s”. Exempel:\nhttps://www.google.com/search?q=%s @@ -2156,7 +2117,7 @@ - Firefox-förslag + Firefox Suggest Sök med Google @@ -2201,9 +2162,6 @@ Gå till inställningar - - Recensionsgranskare - Recensionsgranskare @@ -2217,7 +2175,9 @@ Justerat betyg - Opålitliga recensioner har tagits bort + Opålitliga recensioner har tagits bort + + Baserat på tillförlitliga recensioner Höjdpunkter från de senaste recensionerna @@ -2228,14 +2188,10 @@ bokstavsbetyg från A till F.]]> Pålitliga recensioner. Vi tror att recensionerna troligen kommer från riktiga kunder som lämnat ärliga, opartiska recensioner. - - Vi anser att recensionerna är pålitliga. Vi tror att det finns en blandning av pålitliga och opålitliga recensioner. Opålitliga recensioner. Vi tror att recensionerna sannolikt är falska eller från partiska granskare. - - Vi anser att recensionerna är opålitliga. justerade betyget baseras endast på recensioner som vi anser vara pålitliga.]]> @@ -2251,8 +2207,6 @@ Visa annonser i recensionsgranskaren - Du ser då och då annonser för relevanta produkter. Alla annonser måste uppfylla våra kvalitetsstandarder för recensioner. %s - Du ser då och då annonser för relevanta produkter. Vi annonserar endast produkter med pålitliga recensioner. %s Läs mer @@ -2275,23 +2229,23 @@ När den här produkten har fler recensioner kan vi kontrollera deras kvalitet. - Produkten är inte tillgänglig + Produkten är inte tillgänglig - Om du ser att den här produkten finns i lager igen, rapportera det så jobbar vi med att kontrollera recensionerna. + Om du ser att den här produkten finns i lager igen, rapportera det så jobbar vi med att kontrollera recensionerna. - Rapportera att denna produkt finns i lager igen - - Rapportera att produkten finns i lager + Rapportera att produkten finns i lager - Kontrollerar recensionens kvalitet + Kontrollerar recensionens kvalitet - Kontrollerar recensionens kvalitet + Kontrollerar recensionens kvalitet + + Kontrollerar recensionskvalitet (%s) Detta kan ta uppåt 60 sekunder. - Tack för att du rapporterade! + Tack för att du rapporterade! - Vi bör ha information om denna produkts recensioner inom 24 timmar. Kom tillbaka snart. + Vi bör ha information om denna produkts recensioner inom 24 timmar. Kom tillbaka snart. Vi kan inte kontrollera dessa recensioner @@ -2329,17 +2283,17 @@ Läs mer - Genom att välja "Ja, prova den" godkänner du %1$s av Mozillas %2$s och %3$s. + Genom att välja "Ja, prova den" godkänner du %1$s av Mozillas %2$s och %3$s. - Genom att välja "Ja, prova den" godkänner du följande från %1$s: + Genom att välja "Ja, prova den" godkänner du följande från %1$s: - sekretesspolicy + sekretesspolicy - Sekretesspolicy + Sekretesspolicy - användarvillkor + användarvillkor - Användarvillkor + Användarvillkor Ja, prova den @@ -2375,6 +2329,9 @@ Konkurrenskraft + + "%s" + komprimera @@ -2392,4 +2349,205 @@ öppna länken för att lära dig mer %s, Rubrik + + + Länkar + + Länkar tillgängliga + + + + + + Översätt den här sidan? + + Prova privata översättningar i %1$s + + För din integritet lämnar översättningar aldrig din enhet. Nya språk och förbättringar kommer snart! %1$s + + Läs mer + + Översätt från + + Översätt till + + Inte nu + + Klar + + Översätt + + Försök igen + + Översätter + + + Översättning pågår + + + Det uppstod ett problem med översättningen. Försök igen. + + + Det gick inte att ladda språk. Kontrollera din internetanslutning och försök igen. + + Tyvärr, vi stöder inte %1$s ännu. + + Läs mer + + + + Översättningsalternativ + + Erbjud alltid att översätta + + Översätt alltid %1$s + + Översätt aldrig %1$s + + Översätt aldrig denna sida + + Översättningsinställningar + + Om översättningar i %1$s + + + + Översättningar + + Erbjud att översätta när det är möjligt + + Ladda alltid ned språk i datasparläge + + Översättningsinställningar + + Automatisk översättning + + Översätt aldrig dessa webbplatser + + Ladda ner språk + + + + Automatisk översättning + + Välj ett språk för att hantera inställningarna för "översätt alltid" och "översätt aldrig". + + + + Erbjuda att översätta (standard) + + %1$s kommer att erbjuda att översätta webbplatser till detta språk. + + Översätt alltid + + %1$s kommer att översätta detta språk automatiskt när sidan laddas. + + Översätt aldrig + + %1$s kommer aldrig att erbjuda att översätta webbplatser på detta språk. + + + + Översätt aldrig dessa webbplatser + + För att lägga till en ny webbplats: Besök den och välj "Översätt aldrig den här webbplatsen" från översättningsmenyn. + + Ta bort %1$s + + Tog bort %1$s? + + Ta bort + + Avbryt + + + + Ladda ner språk + + Ladda ner kompletta språk för snabbare översättningar och för att översätta offline. %1$s + + Läs mer + + Tillgängliga språk + + krävs + + %1$s (%2$s) + + Ladda ner språk + + Alla språk + + Ta bort + + Pågår + + Hämta + + Vald + + + Ta bort %1$s (%2$s)? + + Om du tar bort det här språket kommer %1$s att ladda ner delar av språk till din cache när du översätter. + + Ta bort alla språk (%1$s)? + + Om du tar bort alla språk kommer %1$s att ladda ner delar av språk till din cache när du översätter. + + Ta bort + + Avbryt + + + Ladda ner i datasparläge (%1$s)? + + Vi laddar ner delar av språk till din cache för att hålla översättningarna privata. + + Ladda alltid ner i datasparläge + + Ladda ner + + Ladda ner och översätt + + Avbryt + + + + Felsökningsverktyg + + Navigera bakåt + + Flikverktyg + + Antal flikar + + Aktiv + + Inaktiv + + Privat + + Totalt + + Verktyg för att skapa flikar + + Antal flikar att skapa + + Lägg till i aktiva flikar + + Lägg till i inaktiva flikar + + Lägg till i privata flikar diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index 0e747d3f2470..80da7812dfcd 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -70,11 +70,6 @@ Дар ин дастгоҳ ягон осор гузошта нашавад - - Вақте ки шумо ҳамаи равзанаҳои хусусии худро мепӯшед, «%1$s» кукиҳо, таърих ва маълумоти сомонаҳои шуморо нест мекунад. %2$s Ҷустуҷӯ дар саҳифа + + Тарҷума кардани саҳифа Нигоҳ доштан дар маҷмуа @@ -333,14 +330,8 @@ Ҳоло не - - «Firefox»-ро ба браузери ҳамешагии худ табдил диҳед Мо нигоҳдории бехатарии шуморо дӯст медорем - - «Firefox» одамгариро нисбат ба фоидаоварӣ ба ҷойи аввал мегузорад ва махфияти шуморо тавассути манъкунии пайгирикунандаҳои байнисомонавӣ муҳофизат мекунад.\n\nМаълумоти бештар дар «Огоҳномаи махфият»-и мо дастрас аст. Браузери мо, ки аз ҷониби ташкилоти ғайритиҷоратӣ дастгирӣ мешавад, маъракаҳоеро манъ мекунад, ки шуморо ба таври пинҳонӣ дар ҳудуди Интернет пайгирӣ мекунанд.\n\nМаълумоти бештар дар Огоҳномаи махфияти мо. Ҳоло не - Аз телефон ба ноутбук ва баръакс гузаред - Ҳангоми гузариш байни дастгоҳҳо интиқолро рамзгузорӣ намоед - - Барои идомаи кор аз он ҷое, ки шумо ба қарибӣ тамошо кардаед, варақаҳо ва ниҳонвожаҳоро аз дастгоҳҳои дигари худ ба даст оред. Вақте ки шумо ба низом ворид шуда, ҳамоҳанг месозед, шумо бехатартар мешавед. «Firefox» ниҳонвожаҳо, хатбаракҳо ва чизҳои дигари шуморо рамзгузорӣ мекунад. @@ -363,15 +350,9 @@ Ворид шудан Ҳоло не - - Огоҳиҳо барои кори бештар бо «Firefox» ба шумо кумак мекунанд Огоҳиҳо барои кори бехатартар бо «Firefox» ба шумо кумак мекунанд - - Варақаҳоро байни дастгоҳҳо интиқол диҳед, боргириҳоро идора кунед ва барои истифодаи бештари «Firefox» маслиҳат гиред. Варақаҳоро байни дастгоҳҳои худ ба таври бехатар ирсол намоед ва хусусиятҳои дигари махфиятро дар «Firefox» кашф намоед. @@ -412,8 +393,6 @@ Интихоб намоед - Идоракунии миёнбурҳои низомҳои ҷустуҷӯӣ - Идоракунии низомҳои ҷустуҷӯии иловагӣ Таҳрир кардани низомҳои намоён дар менюи ҷустуҷӯ @@ -427,8 +406,6 @@ Низомҳои ҷустуҷӯӣ Пешниҳодҳо аз низомҳои ҷустуҷӯӣ - - Навори нишонӣ Хусусиятҳои навори нишонӣ @@ -439,7 +416,7 @@ Баҳодиҳӣ дар Google Play - Дар бораи %1$s + Дар бораи «%1$s» Гузоштан ҳамчун браузери пешфарз @@ -552,14 +529,10 @@ Бо вуҷуди ин, инчунин, мумкин аст, ки ҳамлакунанда дахолат мекунад. Агар шумо кори худро бо сомона идома диҳед, шумо набояд ягон маълумоти ҳассоси шахсиро ворид намоед. Агар шумо идома диҳед, реҷаи «Танҳо HTTPS» барои сомона муваққатан ғайрифаъол мешавад. Қобилияти дастрасӣ - - Сервери ҳисоби фармоишии Firefox Сервери ҳисоби фармоишии «Mozilla» Сервери ҳамоҳангсозии фармоишӣ - - Сервери ҳисоб/ҳамоҳангсозии Firefox тағйир ёфт. Барои татбиқ кардани тағйирот барнома бояд хомӯш карда шавад… Сервери ҳисоб/ҳамоҳангсозии «Mozilla» тағйир ёфт. Барои татбиқ кардани тағйирот барнома бояд хомӯш карда шавад… @@ -577,8 +550,6 @@ Барои ҳамоҳангсозии варақаҳо, хатбаракҳо, ниҳонвожаҳо ва чизҳои дигар, ворид шавед. - Ҳисоби Firefox - Ҳисоби «Mozilla» Барои барқарор кардани ҳамоҳангсозӣ аз нав пайваст шавед @@ -590,8 +561,6 @@ Маҷмуаи маълумот Ислоҳкунии дурдасти хатоҳо тавассути USB - - Намоиш додани низомҳои ҷустуҷӯӣ Намоиш додани пешниҳодҳои ҷустуҷӯ @@ -723,12 +692,6 @@ Ҷузъҳои иловагиро озмоед - - - Ҷузъи иловагӣ дастгирӣ намешавад - - Ҷузъи иловагӣ аллакай насб карда шуд - Ҷузъҳои иловагӣ муваққатан ғайрифаъол шудаанд @@ -1369,6 +1332,12 @@ Пӯшидани варақаҳои хусусӣ + + + Варақаҳои хусусиро мепӯшед? + + Барои пӯшидани варақаҳои хусусӣ ин огоҳномаро бо ангушт зарба занед ё ламс намоед. + Бозоршиносӣ @@ -1610,6 +1579,8 @@ Ҳамаи кукиҳо (метавонанд фаъолияти сомонаҳоро вайрон кунанд) Ҷудо кардани кукиҳои байнисомонавӣ + + Ба сомонаҳо хабар диҳед, то онҳо маълумотро нафурӯшанд ва мубодила накунанд Муҳтавои пайгирикунанда @@ -1660,7 +1631,7 @@ back from ETP details (Ex: Tracking content) --> Ба қафо гузаштан - Дар %s чӣ нав аст + Дар «%s» чӣ нав аст %s | Китобхонаҳои OSS @@ -1948,28 +1919,18 @@ Илова кардани низоми ҷустуҷӯии нав Таҳрир кардани низоми ҷустуҷӯӣ - - Илова кардан - - Нигоҳ доштан Таҳрир кардан Нест кардан - - Дигар Ном - - Ном Номи низоми ҷустуҷӯӣ Нишонии URL-и сатри ҷустуҷӯ - Сатри ҷустуҷӯ барои истифода - Нишонии URL, ки барои ҷустуҷӯ истифода мешавад Сатри дархостро бо “%s” иваз намоед. Масалан:\nhttps://www.google.com/search?q=%s @@ -2199,8 +2160,6 @@ - Абзори тафтиши тақризҳо - Абзори тафтиши тақризҳо Тақризҳои боэътимод @@ -2213,7 +2172,9 @@ Баҳодиҳии санҷида дурустшуда - Тақризҳои беэътимод тоза карда шудаанд + Тақризҳои беэътимод тоза карда шудаанд + + Дар асоси тақризҳои беэътимод Нуқтаҳои асосӣ аз тақризҳои охирин @@ -2224,14 +2185,10 @@ баҳои ҳарфиро аз A то F таъин мекунем.]]> Тақризҳои боэътимод. Мо боварӣ дорем, ки тақризҳо аз муштариёни ҳақиқӣ ба таври ростқавл ва беғаразона пешниҳод карда шудаанд. - - Мо умедворем, ки тақризҳо боэътимоданд. Мо боварӣ дорем, ки ҳозир будани маҷмӯи тақризҳои боэътимод ва беэътимод имконпазир аст. Тақризҳои беэътимод. Мо боварӣ дорем, ки чунин тақризҳо аз тақризгарони қалбақӣ ва боғараз ворид карда шудаанд. - - Мо умедворем, ки тақризҳо беэътимоданд. Баҳодиҳии санҷида дурустшуда танҳо дар он тақризҳое асос меёбад, ки ба умеди мо боэътимод мебошанд.]]> @@ -2247,8 +2204,6 @@ Намоиш додани реклама дар абзори тафтиши тақризҳо - Баъзе вақт шумо рекламаи тасодуфиро барои маҳсулоти дахлдор мебинед. Тамоми реклама бояд ба стандартҳои сифати тақризҳои мо ҷавобгӯ бошад. %s - Шумо барои маҳсулоти муносиб рекламаи тасодуфиро мебинед. Мо танҳо он маҳсулотеро таблиғ мекунем, ки дорои тақризҳои боэътимод мебошад. %s Маълумоти бештар @@ -2271,23 +2226,23 @@ Вақте ки ин маҳсул дорои тақризҳои сершумор мебошад, мо метавонем сифати он тақризҳоро тафтиш намоем. - Маҳсул дастнорас аст + Маҳсул дастнорас аст - Агар шумо бинед, ки ин маҳсул аз нав дастрас бошад, гузориш диҳед ва мо тақризҳои онро тафтиш мекунем. + Агар шумо бинед, ки ин маҳсул аз нав дастрас бошад, гузориш диҳед ва мо тақризҳои онро тафтиш мекунем. - Гузориш диҳед, ки ин маҳсул аз нав дастрас аст - - Огоҳ кунед, ки маҳсул дастрас аст + Огоҳ кунед, ки маҳсул дастрас аст - Дар ҳоли санҷиши сифати тақризҳо + Дар ҳоли санҷиши сифати тақризҳо - Дар ҳоли санҷиши сифати тақризҳо + Дар ҳоли санҷиши сифати тақризҳо + + Дар ҳоли санҷиши сифати тақризҳо (%s) Ин метавонад тахминан то 60 сония вақт гирад. - Ташаккур барои гузориш! + Ташаккур барои гузориш! - Мо бояд дар муддати 24 соат дар бораи тақризҳои ин маҳсул маълумот гирем. Лутфан, аз нав дертар тафтиш кунед. + Мо бояд дар муддати 24 соат дар бораи тақризҳои ин маҳсул маълумот гирем. Лутфан, аз нав дертар тафтиш кунед. Мо ин тақризҳоро тафтиш карда наметавонем @@ -2325,17 +2280,17 @@ Маълумоти бештар - Бо интихоби «Ҳа, озмоед», шумо ба «%1$s» бо қабули «%2$s» ва «%3$s» аз ҷониби «Mozilla» розӣ мешавед. + Бо интихоби «Ҳа, озмоед», шумо ба «%1$s» бо қабули «%2$s» ва «%3$s» аз ҷониби «Mozilla» розӣ мешавед. - Бо интихоби «Ҳа, озмоед», шумо бо зерин мувофиқи «%1$s» розӣ мешавед: + Бо интихоби «Ҳа, озмоед», шумо бо зерин мувофиқи «%1$s» розӣ мешавед: - сиёсати махфият + сиёсати махфият - Сиёсати махфият + Сиёсати махфият - шартҳои истифода + шартҳои истифода - Шартҳои истифода + Шартҳои истифода Ҳа, озмоед @@ -2371,6 +2326,9 @@ Рақобатпазирӣ + + «%s» + печондан @@ -2388,4 +2346,206 @@ барои маълумоти бештар пайвандро кушоед %s, Сарлавҳа + + + Пайвандҳо + + Пайвандҳои дастрас + + + + + + Саҳифаи ҷориро тарҷума мекунед? + + + Тарҷумаҳои хусусиро дар «%1$s» кӯшиш кунед + + Барои махфияти шумо, тарҷумаҳо ҳеҷ вақт берун аз дастгоҳи шумо бароварда намешаванд. Забонҳои нав ва такмилҳо ба зудӣ меоянд! %1$s + + Маълумоти бештар + + Тарҷума аз забони + + Тарҷума ба забони + + Ҳоло не + + Тайёр + + Тарҷума кунед + + Аз нав кӯшиш кардан + + Дар ҳоли тарҷума + + Дар ҳоли тарҷума қарор дорад + + + Ҳангоми тарҷума мушкилие ба миён омад. Лутфан, аз нав кӯшиш кунед. + + Забонҳоро бор карда натавонист. Пайвасти интернети худро санҷед ва аз нав кӯшиш намоед. + + Мутаассифона, забони %1$s то ҳол дастгирӣ карда намешавад. + + Маълумоти бештар + + + + Имконоти тарҷума + + + Тарҷума ҳамеша пешниҳод карда шавад + + %1$s ҳамеша тарҷума карда шавад + + %1$s ҳеҷ вақт тарҷума карда нашавад + + Ин сомона ҳеҷ гоҳ тарҷума карда нашавад + + Танзимоти сомона + + Дар бораи тарҷумаҳо дар «%1$s» + + + + Тарҷумаҳо + + Тарҷума ба қадри имкон пешниҳод карда шавад + + Забонҳо бояд танҳо дар реҷаи сарфаи маълумот боргирӣ карда шаванд + + Хусусиятҳои тарҷума + + Тарҷумаи худкор + + Ин сомонаҳо бояд ҳеҷ вақт тарҷума карда нашаванд + + Боргирӣ кардани забонҳо + + + + Тарҷумаи худкор + + + Барои идоракунии хусусиятҳои «Ҳамеша тарҷума карда шавад» ва «Ҳеҷ вақт тарҷума карда нашавад» забонеро интихоб намоед. + + + + Тарҷума пешниҳод карда шавад (Ба таври пешфарз) + + «%1$s» дар ин забон тарҷумаи сомонаҳоро пешниҳод мекунад. + + Ҳамеша тарҷума карда шавад + + Вақте ки саҳифа бор мешавад, «%1$s» онро ба ин забон ба таври худкор тарҷума мекунад. + + Ҳеҷ вақт тарҷума карда нашавад + + «%1$s» ҳеҷ вақт дар ин забон тарҷумаи сомонаҳоро пешниҳод намекунад. + + + + Ин сомонаҳо бояд ҳеҷ вақт тарҷума карда нашаванд + + Барои илова кардани сомонаи нав: Ба сомона ворид шавед ва аз менюи тарҷума имкони «Ин сомона бояд ҳеҷ вақт тарҷума карда нашавад»-ро интихоб намоед. + + Тоза кардани «%1$s» + + «%1$s»-ро нест мекунед? + + Нест кардан + + Бекор кардан + + + + Боргирӣ кардани забонҳо + + Барои тарҷумаҳои зудтар ва тарҷумаи офлайн забонҳои мукаммалро боргирӣ намоед. %1$s + + Маълумоти бештар + + Забонҳои дастрас + + ҳатмист + + %1$s (%2$s) + + Боргирӣ кардани забонҳо + + Ҳамаи забонҳо + + Нест кардан + + Дар ҳоли иҷро мебошад + + Боргирӣ кардан + + Интихоб шуд + + + %1$s (%2$s) нест карда шавад? + + Агар шумо ин забонро нест кунед, «%1$s» ҳангоми тарҷумаи шумо забонҳоро қисман ба зерҳофизаи дастгоҳи шумо боргирӣ мекунад. + + Ҳамаи забонҳоро нест мекунед (%1$s)? + + Агар шумо ҳамаи забонҳоро нест кунед, «%1$s» ҳангоми тарҷумаи шумо забонҳоро қисман ба зерҳофизаи дастгоҳи шумо боргирӣ мекунад. + + Нест кардан + + Бекор кардан + + + Ҳангоми истифодаи реҷаи сарфаи маълумот боргирӣ мекунед (%1$s)? + + Барои ба таври махфӣ нигоҳ доштани тарҷумаҳои шумо, мо забонҳоро қисман ба зерҳофизаи дастгоҳи шумо боргирӣ мекунем. + + Бояд танҳо дар реҷаи сарфаи маълумот боргирӣ карда шавад + + Боргирӣ кардан + + Боргирӣ ва тарҷума карда шавад + + Бекор кардан + + + + Абзорҳои ислоҳи хатоҳо + + Ба қафо гузаштан + + Абзорҳои варақаҳо + + Шумораи варақаҳо + + Фаъол + + Ғайрифаъол + + Хусусӣ + + Ҳамагӣ + + Абзори эҷоди варақаҳо + + Шумораи варақаҳое, ки эҷод карда мешаванд + + Илова кардан ба варақаҳои фаъол + + Илова кардан ба варақаҳои ғайрифаъол + + Илова кардан ба варақаҳои хусусӣ diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 644d8141af78..f9a9ad5c7ed9 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -66,11 +66,6 @@ ไม่ทิ้งร่องรอยใดๆ บนอุปกรณ์นี้ - - %1$s จะลบคุกกี้ ประวัติ และข้อมูลไซต์ของคุณเมื่อคุณปิดหน้าต่างส่วนตัวของคุณทั้งหมด %2$s - - ทำให้ Firefox เป็นเบราว์เซอร์เริ่มต้นของคุณ เรารักที่จะดูแลคุณให้ปลอดภัย - - Firefox ให้ความสำคัญกับผู้คนมากกว่าผลกำไรและปกป้องความเป็นส่วนตัวของคุณด้วยการปิดกั้นเครื่องมือติดตามข้ามไซต์\n\nเรียนรู้เพิ่มเติมในประกาศความเป็นส่วนตัวของเรา เบราว์เซอร์ที่ได้รับการสนับสนุนจากองค์กรไม่แสวงหาผลกำไรของเราช่วยหยุดบริษัทต่าง ๆ ไม่ให้แอบติดตามคุณทางเว็บได้\n\nเรียนรู้เพิ่มเติมในประกาศความเป็นส่วนตัวของเรา ไม่ใช่ตอนนี้ - สับเปลี่ยนไปมาระหว่างโทรศัพท์กับแล็ปท็อป - คงการเข้ารหัสเมื่อคุณเปลี่ยนจากอุปกรณ์เครื่องหนึ่งไปยังอีกเครื่องหนึ่ง - - นำแท็บและรหัสผ่านจากอุปกรณ์อื่น ๆ ของคุณเข้ามาเพื่อเรียกดูต่อจากที่คุณค้างไว้ เมื่อคุณลงชื่อเข้าและซิงค์แล้ว คุณจะปลอดภัยยิ่งขึ้น Firefox จะเข้ารหัสลับรหัสผ่าน ที่คั่นหน้า และอื่น ๆ ของคุณ @@ -359,15 +344,9 @@ ลงชื่อเข้า ไม่ใช่ตอนนี้ - - การแจ้งเตือนช่วยให้คุณทำสิ่งต่างๆ ได้มากขึ้นด้วย Firefox การแจ้งเตือนช่วยให้คุณปลอดภัยยิ่งขึ้นด้วย Firefox - - ส่งแท็บระหว่างอุปกรณ์ จัดการการดาวน์โหลด และรับเคล็ดลับในการใช้ประโยชน์สูงสุดจาก Firefox ส่งแท็บระหว่างอุปกรณ์ของคุณอย่างปลอดภัยและค้นพบคุณสมบัติความเป็นส่วนตัวอื่นๆ ใน Firefox @@ -409,8 +388,6 @@ เลือกหนึ่งตัว - จัดการทางลัดการค้นหา - จัดการเครื่องมือค้นหาทางเลือก แก้ไขเครื่องมือที่แสดงในเมนูค้นหา @@ -424,8 +401,6 @@ เครื่องมือค้นหา คำแนะนำจากเครื่องมือค้นหา - - แถบที่อยู่ การกำหนดลักษณะแถบที่อยู่ @@ -523,6 +498,8 @@ อนุญาต + + %1$s เพิ่งปฏิเสธคุกกี้สำหรับคุณ รบกวนสมาธิน้อยลง คุกกี้ติดตามคุณน้อยลงบนเว็บไซต์นี้ @@ -548,14 +525,10 @@ อย่างไรก็ตาม อาจเป็นไปได้ว่าผู้โจมตีมีส่วนเกี่ยวข้อง หากคุณเข้าสู่เว็บไซต์ต่อไป คุณไม่ควรป้อนข้อมูลที่ละเอียดอ่อนใด ๆ หากคุณดำเนินการต่อ โหมด HTTPS-Only จะปิดชั่วคราวสำหรับเว็บไซต์นี้ การช่วยเข้าถึง - - เซิร์ฟเวอร์บัญชี Firefox ที่กำหนดเอง เซิร์ฟเวอร์บัญชี Mozilla ที่กำหนดเอง เซิร์ฟเวอร์ Sync ที่กำหนดเอง - - เปลี่ยนแปลงเซิร์ฟเวอร์บัญชี Firefox/Sync แล้ว กำลังออกจากแอปพลิเคชันเพื่อนำการเปลี่ยนแปลงไปใช้… เปลี่ยนแปลงเซิร์ฟเวอร์บัญชี Mozilla/Sync แล้ว กำลังออกจากแอปพลิเคชันเพื่อนำการเปลี่ยนแปลงไปใช้… @@ -573,8 +546,6 @@ ลงชื่อเข้าเพื่อซิงค์แท็บ ที่คั่นหน้า รหัสผ่าน และอื่น ๆ ของคุณ - บัญชี Firefox - บัญชี Mozilla เชื่อมต่ออีกครั้งเพื่อทำการซิงค์ต่อ @@ -586,8 +557,6 @@ การเก็บรวบรวมข้อมูล การดีบั๊กระยะไกลผ่าน USB - - แสดงเครื่องมือค้นหา แสดงข้อเสนอแนะการค้นหา @@ -722,12 +691,6 @@ สำรวจส่วนเสริม - - - ไม่รองรับส่วนเสริม - - ส่วนเสริมถูกติดตั้งแล้ว - ส่วนเสริมถูกปิดใช้งานชั่วคราว @@ -1598,6 +1561,8 @@ คุกกี้ทั้งหมด (จะส่งผลให้เว็บไซต์ไม่สมบูรณ์) แยกคุกกี้ข้ามไซต์ + + บอกเว็บไซต์ไม่ให้ขายหรือแบ่งปันข้อมูล ตัวติดตามเนื้อหา @@ -1937,28 +1902,18 @@ เพิ่มเครื่องมือค้นหาใหม่ แก้ไขเครื่องมือค้นหา - - เพิ่ม - - บันทึก แก้ไข ลบ - - อื่น ๆ ชื่อ - - ชื่อ ชื่อเครื่องมือค้นหา URL สตริงการค้นหา - สตริงการค้นหาที่จะใช้ - URL ที่จะใช้ในการค้นหา แทนที่คำค้นด้วย “%s” ตัวอย่าง:\nhttps://www.google.com/search?q=%s @@ -2188,8 +2143,6 @@ - ตัวตรวจสอบบทวิจารณ์ - ตัวตรวจสอบบทวิจารณ์ บทวิจารณ์ที่น่าเชื่อถือ @@ -2202,7 +2155,9 @@ คะแนนที่ปรับแล้ว - เอาบทวิจารณ์ที่ไม่น่าเชื่อถือออกแล้ว + เอาบทวิจารณ์ที่ไม่น่าเชื่อถือออกแล้ว + + อ้างอิงจากบทวิจารณ์ที่เชื่อถือได้ ไฮไลต์จากบทวิจารณ์ล่าสุด @@ -2213,14 +2168,10 @@ เกรดที่เป็นตัวอักษรให้กับบทวิจารณ์ของผลิตภัณฑ์แต่ละรายการตั้งแต่ A ถึง F]]> บทวิจารณ์ที่น่าเชื่อถือ เราเชื่อว่าบทวิจารณ์นั้นน่าจะมาจากลูกค้าจริงซึ่งให้คำวิจารณ์อย่างตรงไปตรงมาและไม่มีอคติ - - เราเชื่อว่าบทวิจารณ์เหล่านั้นน่าเชื่อถือ เราเชื่อว่ามีทั้งบทวิจารณ์ที่น่าเชื่อถือและไม่น่าเชื่อถือปะปนกัน บทวิจารณ์ที่ไม่น่าเชื่อถือ เราเชื่อว่าบทวิจารณ์นั้นน่าจะเป็นของปลอมหรือมาจากผู้วิจารณ์ที่มีอคติ - - เราเชื่อว่าบทวิจารณ์เหล่านั้นไม่น่าเชื่อถือ คะแนนที่ปรับปรุงแล้วจะขึ้นอยู่กับบทวิจารณ์ที่เราเชื่อว่าน่าเชื่อถือเท่านั้น]]> @@ -2235,6 +2186,8 @@ การตั้งค่า แสดงโฆษณาในตัวตรวจสอบบทวิจารณ์ + + คุณจะเห็นโฆษณาผลิตภัณฑ์ที่เกี่ยวข้องเป็นครั้งคราว เราโฆษณาเฉพาะผลิตภัณฑ์ที่มีบทวิจารณ์ที่เชื่อถือได้เท่านั้น %s เรียนรู้เพิ่ม @@ -2243,6 +2196,8 @@ ลองดูเพิ่ม โฆษณาโดย %s + + ตัวตรวจสอบบทวิจารณ์ขับเคลื่อนโดย %s %s โดย Mozilla @@ -2251,36 +2206,50 @@ ตรวจสอบตอนนี้ บทวิจารณ์ยังไม่เพียงพอ + + เมื่อผลิตภัณฑ์นี้มีบทวิจารณ์มากขึ้น เราจะสามารถตรวจสอบคุณภาพของบทวิจารณ์ได้ - สินค้าไม่พร้อมจำหน่าย - - รายงานสินค้านี้ได้กลับมาในสต็อก + สินค้าไม่พร้อมจำหน่าย + + หากคุณเห็นว่าสินค้านี้มีอยู่ในสต็อกแล้ว โปรดรายงานแล้วเราจะทำการตรวจสอบบทวิจารณ์ - รายงานสินค้ามีในสต็อก + รายงานสินค้ามีในสต็อก - กำลังตรวจสอบคุณภาพบทวิจารณ์ + กำลังตรวจสอบคุณภาพบทวิจารณ์ - กำลังตรวจสอบคุณภาพบทวิจารณ์ + กำลังตรวจสอบคุณภาพบทวิจารณ์ + + กำลังตรวจสอบคุณภาพบทวิจารณ์ (%s) การดำเนินการนี้อาจใช้เวลาประมาณ 60 วินาที - ขอบคุณสำหรับการรายงาน! + ขอบคุณสำหรับการรายงาน! + + เราคาดว่าจะได้รับข้อมูลเกี่ยวกับบทวิจารณ์ของผลิตภัณฑ์นี้ภายใน 24 ชั่วโมง โปรดกลับมาตรวจสอบอีกครั้งในภายหลัง เราไม่สามารถตรวจสอบบทวิจารณ์เหล่านี้ได้ + + ขออภัย เราไม่สามารถตรวจสอบคุณภาพบทวิจารณ์สำหรับผลิตภัณฑ์บางชนิดได้ เช่น บัตรของขวัญ วิดีโอสตรีมมิง เพลง และเกม ข้อมูลจะมาเร็ว ๆ นี้ + + เราคาดว่าจะได้รับข้อมูลเกี่ยวกับบทวิจารณ์ของผลิตภัณฑ์นี้ภายใน 24 ชั่วโมง โปรดกลับมาตรวจสอบอีกครั้งในภายหลัง การวิเคราะห์เป็นข้อมูลล่าสุด เข้าใจแล้ว ไม่มีข้อมูลในขณะนี้ + + เรากำลังดำเนินการแก้ไขปัญหานี้ โปรดกลับมาตรวจสอบอีกครั้งเร็วๆ นี้ ไม่มีการเชื่อมต่อเครือข่าย ตรวจสอบการเชื่อมต่อเครือข่ายของคุณแล้วลองโหลดหน้าใหม่ ยังไม่มีข้อมูลเกี่ยวกับบทวิจารณ์เหล่านี้ + + หากต้องการทราบว่าบทวิจารณ์ของผลิตภัณฑ์นี้เชื่อถือได้หรือไม่ ให้ตรวจสอบคุณภาพบทวิจารณ์ โดยจะใช้เวลาเพียงประมาณ 60 วินาที ตรวจสอบคุณภาพบทวิจารณ์ @@ -2326,6 +2295,9 @@ ความสามารถในการแข่งขัน + + “%s” + ยุบ @@ -2341,4 +2313,55 @@ อ่านบทความ เปิดลิงก์เพื่อเรียนรู้เพิ่มเติม + + + + + + การแปลอัตโนมัติ + + + + เสนอให้แปล (ค่าเริ่มต้น) + + แปลเสมอ + + ไม่ต้องแปล + + + + ไม่ต้องแปลไซต์เหล่านี้ + + เอา %1$s ออก + + ลบ %1$s หรือไม่? + + ลบ + + ยกเลิก + + + + ดาวน์โหลดภาษา + + เรียนรู้เพิ่ม + + ภาษาที่มี + + จำเป็น + + ดาวน์โหลดภาษา + + ภาษาทั้งหมด + + ลบ + + ดำเนินการอยู่ + + ดาวน์โหลด + + เลือกแล้ว + diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index e0fc1db417ef..17d9a6662554 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -69,11 +69,6 @@ Bu cihazda iz bırakmayın - - %1$s, tüm gizli pencerelerinizi kapattığınızda çerezlerinizi, geçmişinizi ve site verilerinizi temizler. %2$s Sayfada bul + + Sayfayı çevir Koleksiyona kaydet @@ -332,14 +329,8 @@ Şimdi değil - - Firefox varsayılan tarayıcınız olsun Sizi güvende tutmayı seviyoruz - - Firefox için paradan önce insanlık gelir. Siteler arası takip kodlarını engelleyerek gizliliğinizi koruyoruz.\n\nAyrıntıları gizlilik bildirimimizde bulabilirsiniz. Kâr amacı gütmeyen tarayıcımız, şirketlerin sizi web’de gizlice takip etmesini engelliyor.\n\nAyrıntıları gizlilik bildirimimizde bulabilirsiniz. Şimdi değil - Telefondan bilgisayara, bilgisayardan telefona geçin - Cihazlarınız arasında güvenle geçiş yapın - - Diğer cihazlarınızdaki sekmeleri ve parolaları alın, kaldığınız yerden devam edin. Giriş yapıp eşitlemeyi tamamladığınızda daha güvende olursunuz. Firefox, parolalarınızı, yer imlerinizi ve diğer verilerinizi şifreler. @@ -362,15 +349,9 @@ Giriş yap Şimdi değil - - Bildirimler sayesinde Firefox ile daha fazlasını yapın Bildirimler Firefox ile daha güvende kalmanızı sağlar - - Sekmelerinizi cihazdan cihaza gönderin, indirmelerinizi yönetin ve Firefox ile ilgili ipuçları alın. Sekmelerinizi cihazlarınız arasında güvenli bir şekilde gönderin ve Firefox’un diğer gizlilik özelliklerini keşfedin. @@ -413,8 +394,6 @@ Birini seçin - Arama kısayollarını yönet - Alternatif arama motorlarını yönet Arama menüsünde görünen motorları düzenle @@ -428,8 +407,6 @@ Arama motorları Arama motorlarından öneriler - - Adres çubuğu Adres çubuğu tercihleri @@ -552,14 +529,10 @@ Ancak bir saldırganın araya girmiş olması da mümkün. Bu web sitesine girerseniz hassas bilgilerinizi siteyle paylaşmayın. Devam ederseniz yalnızca HTTPS modu bu sitede geçici olarak kapatılacaktır. Erişilebilirlik - - Özel Firefox Hesabı sunucusu Özel Mozilla hesabı sunucusu Özel Sync sunucusu - - Firefox Hesabı/Sync sunucusu değiştirildi. Değişiklikleri uygulamak için uygulamadan çıkılıyor… Mozilla hesabı/Sync sunucusu değiştirildi. Değişiklikleri uygulamak için uygulamadan çıkılıyor… @@ -577,8 +550,6 @@ Sekmeleri, yer imlerini, parolaları ve daha fazlasını eşitlemek için giriş yapın. - Firefox Hesabı - Mozilla hesabı Eşitlemeye devam etmek için yeniden bağlayın @@ -590,8 +561,6 @@ Veri toplama USB ile uzaktan hata ayıklama - - Arama motorlarını göster Arama önerilerini göster @@ -723,12 +692,6 @@ Eklentileri keşfet - - - Eklenti desteklenmiyor - - Eklenti zaten yüklenmiş - Eklentiler geçici olarak devre dışı bırakıldı @@ -1366,6 +1329,7 @@ Gizli sekmeleri kapat + Pazarlama @@ -1604,6 +1568,8 @@ Tüm çerezler (Bazı web siteleri bozulabilir.) Siteler arası çerezleri izole et + + Web sitelerine verilerimi satmamalarını ve paylaşmamalarını söyle Takip amaçlı içerikler @@ -1942,28 +1908,18 @@ Yeni arama motoru ekle Arama motorunu düzenle - - Ekle - - Kaydet Düzenle Sil - - Diğer Adı - - Adı Arama motoru adı Arama dizgisinin URL’si - Kullanılacak arama dizgisi - Arama için kullanılacak URL Sorguyu “%s” ile değiştirin. Örnek:\nhttps://www.google.com/search?q=%s @@ -2192,8 +2148,6 @@ - Değerlendirme kontrolcüsü - Değerlendirme Kontrolcüsü Güvenilir değerlendirmeler @@ -2206,7 +2160,9 @@ Düzeltilmiş puan - Güvenilmez değerlendirmeler kaldırıldı + Güvenilmez değerlendirmeler kaldırıldı + + Güvenilir değerlendirmelere dayanarak Öne çıkan son değerlendirmeler @@ -2217,14 +2173,10 @@ harf notu veriyoruz.]]> Güvenilir değerlendirmeler. Değerlendirmelerin büyük olasılıkla dürüst, tarafsız incelemeler yazan gerçek müşterilerden geldiğini düşünüyoruz. - - Değerlendirmelerin güvenilir olduğunu düşünüyoruz. Güvenilir ve güvenilmez değerlendirmelerin bir karışımı olduğunu düşünüyoruz. Güvenilmez değerlendirmeler. Değerlendirmelerin büyük ihtimalle sahte olduğunu veya önyargılı kişilerden geldiğini düşünüyoruz. - - Değerlendirmelerin güvenilmez olduğunu düşünüyoruz. Düzeltilmiş puan yalnızca güvenilir olduğunu düşündüğümüz değerlendirmelere dayanır.]]> @@ -2240,8 +2192,6 @@ Değerlendirme denetleyicisinde reklamları göster - Ara sıra ilgili ürünlerin reklamlarını görebilirsiniz. Tüm reklamlar değerlendirme kalitesi standartlarımızı karşılamak zorundadır. %s - Ara sıra ilgili ürünlerin reklamlarını görebilirsiniz. Yalnızca güvenilir değerlendirmeleri olan ürünlerin reklamlarını kabul ediyoruz. %s Daha fazla bilgi alın @@ -2264,23 +2214,23 @@ Bu ürüne daha fazla değerlendirme geldiğinde değerlendirmelerin kalitelerini kontrol edebileceğiz. - Ürün mevcut değil + Ürün mevcut değil - Bu ürünün yeniden stoğa girdiğini görürseniz bize bildirin, biz de değerlendirmeleri kontrol etmeye çalışalım. + Bu ürünün yeniden stoğa girdiğini görürseniz bize bildirin, biz de değerlendirmeleri kontrol etmeye çalışalım. - Bu ürünün tekrar stokta olduğunu bildir - - Ürünün stokta olduğunu bildir + Ürünün stokta olduğunu bildir - Değerlendirme kalitesi kontrol ediliyor + Değerlendirme kalitesi kontrol ediliyor - Değerlendirme kalitesi kontrol ediliyor + Değerlendirme kalitesi kontrol ediliyor + + Değerlendirme kalitesi kontrol ediliyor (%s) Yaklaşık 60 saniye sürebilir. - Bildirdiğiniz için teşekkürler! + Bildirdiğiniz için teşekkürler! - Bu ürünün değerlendirmeleriyle ilgili 24 saat içinde bilgi alacağız. Lütfen daha sonra tekrar kontrol edin. + Bu ürünün değerlendirmeleriyle ilgili 24 saat içinde bilgi alacağız. Lütfen daha sonra tekrar kontrol edin. Bu değerlendirmeleri kontrol edemiyoruz @@ -2318,17 +2268,17 @@ Daha fazla bilgi alın - “Evet, deneyeceğim”i seçtiğinizde Mozilla %1$s %2$s ve %3$snı kabul etmiş olursunuz. + “Evet, deneyeceğim”i seçtiğinizde Mozilla %1$s %2$s ve %3$snı kabul etmiş olursunuz. - “Evet, deneyeceğim”i seçtiğinizde %1$s için şunları kabul etmiş olursunuz: + “Evet, deneyeceğim”i seçtiğinizde %1$s için şunları kabul etmiş olursunuz: - gizlilik politikası + gizlilik politikası - Gizlilik politikası + Gizlilik politikası - kullanım koşulları + kullanım koşulları - Kullanım koşulları + Kullanım koşulları Evet, deneyeceğim @@ -2366,6 +2316,9 @@ Rekabet gücü + + “%s” + daralt @@ -2383,4 +2336,206 @@ bilgi almak için bağlantıyı aç %s, Başlık + + + Bağlantılar + + + Kullanılabilir bağlantılar var + + + + + + Bu sayfa çevrilsin mi? + + %1$s ile gizli çevirileri deneyin + + Gizliliğinizi korumak için çeviriler asla cihazınızdan dışarı çıkmaz. Yeni diller ve gelişmeler de yolda! %1$s + + Daha fazla bilgi alın + + Bu dilden + + Bu dile + + Şimdi değil + + Tamam + + Çevir + + Yeniden dene + + Çevriliyor + + Çeviri devam ediyor + + + Çeviri sırasında bir sorun oluştu. Lütfen yeniden deneyin. + + Diller yüklenemedi. İnternet bağlantınızı kontrol edip yeniden deneyin. + + Maalesef henüz %1$s dilini desteklemiyoruz. + + Daha fazla bilgi al + + + + Çeviri Seçenekleri + + Her zaman çevirmeyi teklif et + + %1$s dilini her zaman çevir + + %1$s dilini asla çevirme + + Bu siteyi asla çevirme + + Çeviri ayarları + + %1$s çevirileri hakkında + + + + Çeviriler + + Mümkün olduğunda çevirmeyi teklif et + + + Veri tasarrufu modundayken dilleri her zaman indir + + Çeviri tercihleri + + Otomatik çeviri + + Bu siteleri asla çevirme + + Dilleri indir + + + + Otomatik çeviri + + + ”Her zaman çevir“ ve ”asla çevirme“ tercihlerini yönetmek için bir dil seçin. + + + + Çevirmeyi öner (varsayılan) + + %1$s bu dildeki siteleri çevirmeyi önerecek. + + Her zaman çevir + + Sayfa yüklendiğinde %1$s bu dili otomatik olarak çevirecek. + + Asla çevirme + + + %1$s bu dildeki siteleri çevirmeyi asla önermeyecek. + + + + Bu siteleri asla çevirme + + Yeni bir site eklemek isterseniz siteyi ziyaret edip çeviri menüsünden “Bu siteyi asla çevirme” seçeneğini seçin. + + %1$s sitesini kaldır + + %1$s silinsin mi? + + Sil + + + İptal + + + + Dilleri indir + + Daha hızlı çeviriler ve çevrimdışı çeviri için dillerin tamamını indirebilirsiniz. %1$s + + Daha fazla bilgi alın + + Kullanılabilir diller + + gerekli + + %1$s (%2$s) + + Dilleri indir + + Tüm diller + + Sil + + Devam ediyor + + İndir + + Seçildi + + + %1$s (%2$s) silinsin mi? + + Bu dili silerseniz %1$s çeviri sırasında dillerin bir kısmını önbelleğinize indirir. + + Tüm diller (%1$s) silinsin mi? + + Tüm dilleri silerseniz %1$s siz çeviri yaparken dillerin bir kısmını önbelleğinize indirir. + + Sil + + Vazgeç + + + Veri tasarrufu modunda indirilsin mi? (%1$s) + + Çevirileri gizli tutmak için dillerin bir kısmını önbelleğinize indiriyoruz. + + Veri tasarrufu modunda her zaman indir + + İndir + + İndir ve çevir + + Vazgeç + + + + Hata ayıklama araçları + + Sekme araçları + + Sekme sayısı + + Aktif + + Pasif + + Gizli + + Toplam + + Sekme oluşturma aracı + + Oluşturulacak sekme sayısı + + Aktif sekmelere ekle + + Pasif sekmelere ekle + + Gizli sekmelere ekle diff --git a/app/src/main/res/values-ug/strings.xml b/app/src/main/res/values-ug/strings.xml index cc1f2819dffa..0e1180dc9763 100644 --- a/app/src/main/res/values-ug/strings.xml +++ b/app/src/main/res/values-ug/strings.xml @@ -70,11 +70,6 @@ بۇ ئۈسكۈنىدە ئىز قالدۇرمايدۇ - - بارلىق شەخسىيەت كۆزنەكلىرى تاقالغاندا %1$s سىزنىڭ cookies، تارىخ ۋە تور بېكەت سانلىق مەلۇماتلىرىڭىزنى ئۆچۈرىدۇ. %2$s بەتتىن ئىزدە + + بەت تەرجىمىسى يىغقۇچقا ساقلا @@ -324,14 +321,8 @@ ھازىر ئەمەس - - Firefox نى ئاساسىي تور كۆرگۈڭىزگە ئايلاندۇرۇڭ بىخەتەرلىكىڭىزنى ساقلاشنى ياخشى كۆرىمىز - - Firefox تور بېكەتتىكى ئىز قوغلىغۇچلارنى توسۇش ئارقىلىق كىشىلەرنى مەنپەئەتتىن ئۈستۈن قىلىدۇ ۋە شەخسىيىتىڭىزنى قوغدايدۇ.\n\nشەخسىيەت ئۇقتۇرۇشىمىزدىن كۆپرەك ئۆگىنەلەيسىز. پايدا تاپمايدىغان ئورگان قوللايدىغان توركۆرگۈمىز شىركەتلەرنىڭ سىزنى مەخپىي ھالدا توردىن ئىزلىشىنى توختىتىشىغا ياردەم بېرىدۇ.\n\nشەخسىيەت ئۇقتۇرۇشى ھەققىدىكى تەپسىلات بىلدۈرگۈسى. ھازىر ئەمەس - تېلېفوندىن يان كومپيۇتېر ئارىسىدا تېز ئالماشتۇرىدۇ - ئۈسكۈنىلەر ئارا ئالماشتۇرغاندا شىفىرلىنىدۇ - - باشقا ئۈسكۈنىلىرىڭىزدىكى بەتكۈچ ۋە ئىملارنى قەدەمداشلاپ، كەلگەن جايدىن داۋاملاشتۇرالايسىز. تىزىمغا كىرىپ قەدەمداشلىسىڭىز، تېخىمۇ بىخەتەر بولىسىز. Firefox ئىم، خەتكۈچ ۋە باشقىلارنى مەخپىيلەشتۈرىدۇ. @@ -354,15 +341,9 @@ تىزىمغا كىرىڭ ھازىر ئەمەس - - ئۇقتۇرۇشلار Firefox بىلەن تېخىمۇ كۆپ ئىشلارنى قىلىشىڭىزغا ياردەم بېرىدۇ ئۇقتۇرۇشلار Firefox ئارقىلىق تېخىمۇ بىخەتەر بولۇشىڭىزغا ياردەم بېرىدۇ - - ئۈسكۈنىلەر ئارا بەتكۈچ ئەۋەتىپ، چۈشۈرۈشنى باشقۇرۇپ ۋە Firefox تىن ئەڭ ياخشى پايدىلىنىشقا ئائىت تەكلىپلەرگە ئېرىشەلەيسىز. ئۈسكۈنىڭىز ئارىسىدا بەتكۈچلەرنى بىخەتەر ئەۋەتىپ، Firefox دىكى باشقا شەخسىيەت ئىقتىدارلىرىنى بايقايدۇ. @@ -402,8 +383,6 @@ بىرى تاللىنىدۇ - ئىزدەش قىسقا يولى باشقۇرۇش - باشقا ئىزدەش موتورلىرىنى باشقۇرۇش ئىزدەش تىزىملىكىدە كۆرۈنىدىغان موتورلارنى تەھرىرلەيدۇ @@ -417,8 +396,6 @@ ئىزدەش موتورى ئىزدەش موتورىنىڭ تەكلىپلىرى - - ئادرېس ستونى ئادرېس بالداق مايىللىقى @@ -492,6 +469,16 @@ %1$s غا cookie لوزۇنكىسى ئازايتىشنى تاقامدۇ؟ %1$s غا cookie لوزۇنكىسى توسقۇچنى تاقامدۇ؟ + + %1$s بۇ تور بېكەتنىڭ ساقلانما ئىلتىماسىنى ئۆزلۈكىدىن رەت قىلالمايدۇ. كەلگۈسىدە بۇ تور بېكەتنى قوللاش ئىلتىماسىنى ئەۋەتسىڭىز بولىدۇ. + + %1$s بۇ تور بېكەتنىڭ ساقلانمىسىنى تازىلاپ بەتنى يېڭىلايدۇ. بارلىق ساقلانمىلار تازىلانسا سىز تىزىمدىن چىقىپ كېتىشىڭىز ياكى مال ھارۋىسى بوشىتىلىشى مۇمكىن. + + تاقالسا ۋە %1$s ساقلانمىنى تازىلاپ بۇ تور بېكەتنى قايتا يۈكلەيدۇ. سىز تىزىمدىن چىقىپ كېتىشىڭىز ياكى مال ھارۋىسى بوشىتىلىشى مۇمكىن. + + %1$s قوللايدىغان تور بېكەتلەرنىڭ بارلىق ساقلانما تەلەپلىرىنى ئاپتوماتىك رەت قىلىشنى سىنايدۇ. + + ئېچىلسا، %1$s بۇ تور بېكەتتىكى بارلىق ساقلانما لوزۇنكىسىنى ئۆزلۈكىدىن رەت قىلىشنى سىنايدۇ. %1$s نىڭ cookie لوزۇنكىسىنى رەت قىلىشىغا يول قويامدۇ؟ @@ -506,6 +493,11 @@ %1$s سىز ئۈچۈن ساقلانمىنى رەت قىلدى + + بۇ تور بېكەتتە دىققەتنى چاچىدىغان ئىشلار ئاز، ساقلانما ئاز. + + + بىخەتەرلىكنى ئۆستۈرۈش ئۈچۈن HTTPS مەخپىيلەشتۈرۈش كېلىشىمنامىسى ئارقىلىق تور بېكەتلەرگە ئاپتوماتىك ئۇلىنىدۇ. تاقاق @@ -522,16 +514,16 @@ بىخەتەر تور بېكەت يوق بەلكىم بو تور بېكەت HTTPS نى قوللىماسلىقى مۇمكىن. + + شۇنداقتىمۇ، تور ھۇجۇمچىلىرىنىڭ ھۇجۇمىغا ئۇچرىشى مۇمكىن. ئەگەر بۇ تور بېكەتنى زىيارت قىلىشنى داۋاملاشتۇرسىڭىز، ھېچقانداق سەزگۈر ئۇچۇرنى كىرگۈزمەڭ. ئەگەر داۋاملاشتۇرسىڭىز، بۇ تور بېكەت ئۈچۈن HTTPS لا ھالىتى ۋاقىتلىق تاقىلىدۇ. قۇلايلىقلار - - ئىختىيارى Firefox ھېسابات مۇلازىمېتىرى ئىختىيارى Mozilla ھېسابات مۇلازىمېتىرى ئىختىيارى قەدەمداش مۇلازىمېتىر - - Firefox ھېساباتى/قەدەمداش مۇلازىمېتىرى ئۆزگەرتىلدى. پىروگراممىنىڭ ئۆزگەرتىش ئىلتىماسىدىن ۋاز كېچىۋاتىدۇ… + + Mozilla ھېسابات/قەدەمداش مۇلازىمېتىر تەڭشىكى ئۆزگەردى. ئۆزگىرىشنى قوللىنىش ئۈچۈن پىروگراممىدىن چېكىنىۋاتىدۇ… ھېسابات @@ -547,8 +539,6 @@ تىزىمغا كىرسە بەتكۈچ، خەتكۈچ، ئىم ۋە باشقا سانلىق مەلۇماتلار قەدەمداشلىنىدۇ. - ئوتتۈلكە ھېساباتى - Mozilla ھېسابات قايتا باغلىنىپ قەدەمداشلاشنى داۋاملاشتۇرىدۇ @@ -561,8 +551,6 @@ سانلىق مەلۇمات توپلاش USB ئارقىلىق يىراقتىن سازلاش - - ئىزدەش موتورىنى كۆرسىتىدۇ ئىزدەش تەكلىپلىرىنى كۆرسىتىدۇ @@ -584,6 +572,9 @@ ئۆزلۈكىدىن تاماملانغان تور ئادرېسلىرى ياردەمچىنىڭ تەكلىپلىرى + + قوللاش سودىگەرلىرىنىڭ ئېلانىنى ئانچە-مۇنچە كۆرسىتىشىگە يول قويۇپ %1$s نى قوللاڭ %1$s نىڭ تەكلىپى @@ -691,15 +682,11 @@ قوشۇلما ئىزدەش - - - قوشۇلمىنى قوللىمايدۇ - - قوشۇلما ئورنىتىلغان - قوشۇلما ۋاقىتلىق چەكلەنگەن + + بىر ياكى بىر قانچە قوشۇلما ئىشلەشتىن توختاپ، سىستېمىنىڭ مۇقىملىقىغا تەسىر كۆرسەتتى. %1$s قوشۇلمىنى قايتا قوزغىتىشنى سىنىشى مەغلۇپ بولدى.\n\nقوشۇلما نۆۋەتتىكى سۆزلىشىشتە قايتا قوزغىتىلمايدۇ.\n\nبۇ مەسىلىنى قوشۇلمىنى چىقىرىۋېتىپ ياكى چەكلەپ ھەل قىلغىلى بولۇشى مۇمكىن. قوشۇلمىنى قايتا قوزغىتىپ بېقىڭ @@ -770,8 +757,12 @@ ئىشلىتىلىشى ۋە تېخنىكىلىق سانلىق مەلۇمات + + تور كۆرگۈ ئىشلىتىش جەريانىدىكى ئىش ئۈنۈمى، ئىشلىتىش ئۇسۇلى، قاتتىق دېتال ۋە خاسلاشتۇرۇلغان سانلىق مەلۇماتنى Mozilla بىلەن ھەمبەھىرلەپ، %1$s نى ياخشىلىشىمىزغا ياردەم بېرىڭ بازارچىلىق سانلىق مەلۇماتلىرى + + كۆچمە بازارچىلىق سودىگىرىمىز Adjust بىلەن ئاساسىي ئىشلىتىش سانلىق مەلۇماتلىرىنى ئورتاقلىشىدۇ تەتقىقات @@ -786,6 +777,10 @@ ھېساباتنى چىقىرىۋەت + + + firefox.com/pair دا كۆرسىتىلگەن QR كودىنى تاراڭ]]> + چوققا @@ -839,6 +834,9 @@ بەتكۈچ %d نى ئاچامدۇ؟ + + بىرلا ۋاقىتتا كۆپ بەتكۈچ يۈكلەنسە %s نىڭ ئىجرا قىلىنىشىنى ئاستىلىتىۋېتىشى مۇمكىن. راستىنلا داۋاملاشتۇرامسىز؟ بەتكۈچ ئاچ @@ -1318,6 +1316,11 @@ شەخسىي بەتكۈچنى ياپ + + + شەخسىي بەتكۈچنى ياپامدۇ؟ + بۇ ئۇقتۇرۇش چېكىلسە ياكى سۈرۈلسە شەخسىي بەتكۈچ تاقىلىدۇ. + بازارچىلىق كۈچەيتىلگەن ئىزلاشتىن قوغداش + + ھازىر ئومۇمىيەت ساقلانما قوغداش ئىقتىدارى بار، تور بېكەت ھالقىغان ئىز قوغلىغۇچىلارغا قارشى ئەڭ كۈچلۈك توساق. + + %s سىزنى توردىكى ئىشلىرىڭىزغا ئەگىشىدىغان كۆپ ئۇچرايدىغان ئىزچىلاردىن قوغدايدۇ. تەپسىلاتى @@ -1526,6 +1533,8 @@ ئۆلچەملىك ئىز قوغلاشتىن قوغداشتا نېمىلەر توسۇلىدۇ قاتتىق + + ئىزلاشتىن قوغداش تېخىمۇ كۈچلۈك ۋە ئىقتىدارى تېخىمۇ تېز، ئەمما بەزى تور بېكەتلەر نورمال ئىشلىمەسلىكى مۇمكىن. ئىز قوغلاشتىن قاتتىق قوغداشتا نېمىلەر توسۇلىدۇ @@ -1547,6 +1556,8 @@ بارلىق Cookies (تور بېكەتلەرنىڭ بۇزۇلۇشىنى كەلتۈرۈپ چىقىرىدۇ) بېكەت ھالقىغان Cookies نى ئايرىۋېتىدۇ + + تور بېكەتلەرگە ئۇچۇرلىرىڭىزنى تارقاتماسلىق ۋە ساتماسلىقنى ئېيتىڭ ئىز قوغلاش مەزمۇنى @@ -1565,16 +1576,28 @@ يول قويغان ئىجتىمائىي تاراتقۇ ئىزلىغۇچ + + ئىجتىمائىي ئالاقە تورىنىڭ توردىكى پائالىيىتىڭىزنى ئىز قوغلاش ئىقتىدارىنى چەكلەيدۇ. بېكەت ھالقىغان ئىزلاش cookie بېكەت ھالقىغان cookies + + تور تەھلىل شىركەتلىرى ۋە ئېلان تورلىرى تور بېكەت ھالقىپ تور كۆرگۈ سانلىق مەلۇماتلىرىنى توپلايدىغان ساقلانمىلارنى توسىدۇ. + + ئومۇمىيەت ساقلانما قوغداش ئىقتىدارى ھەر بىر تور بېكەتنىڭ ساقلانمىسىنى ئايرىۋېتىپ، ئېلان تورلىرىنىڭ تور بېكەت ھالقىپ بۇ خىل ئىزلىغۇچلارنى ئىشلىتىپ ئەگىشىشىنى چەكلەيدۇ. شىفىرلىق پۇل قازغۇچ + + يامان غەرەزلىك قوليازمىلارنىڭ ئۈسكۈنىڭىزدە رەقەملىك پۇل قېزىشىنى توسىدۇ. بارماق ئىزى ئىزلىغۇچ + + ئىز قوغلاش مەقسىتىدە ئىشلىتىلىدىغان ئۈسكۈنىڭىزگە ئائىت بىردىنبىر پەرقلىنىدىغان سانلىق مەلۇماتلارنى توپلاشنى توختىتىدۇ. ئىز قوغلاش مەزمۇنى + + ئىز قوغلاش كودى بار ئېلان، سىن ۋە باشقا مەزمۇنلارنى يۈكلەشتىن توختىتىدۇ. بەزى تور بېكەتلەرنىڭ ئىقتىدارىغا تەسىر كۆرسىتىشى مۇمكىن. قوغداش بۇ بېكەتكە ئوچۇق @@ -1591,9 +1614,18 @@ %s | ئوچۇق كودلۇق يۇمشاق دېتال ئامبارلىرى قايتا نىشانلايدىغان ئىز قوغلىغۇچ + + مەلۇملۇق ئىزلىغۇچى تور بېكەتلەرنىڭ قايتا نىشانلاش تەڭشىكى بار ساقلانمىلارنى تازىلايدۇ. + + بۇ بەتتىكى تۆۋەندە بەلگە قويۇلغان بەزى ئىزچىلار قىسمەن قۇلۇپلانمىدى، چۈنكى سىز ئۇلار بىلەن تەسىرلەشتىڭىز*. تەپسىلاتى + + كۈچەيتىلگەن ئىز قوغلاشتىن قوغداش مۇستەسنا مايىللىق سىنبەلگىسى + قوللاش @@ -1636,6 +1668,9 @@ تېزلەتمە ئىسمى + + تېز سۈرئەتتە زىيارەت قىلىش ۋە ئەپكە ئوخشاش زىيارەت تۇيغۇسىغا ئېرىشىش ئۈچۈن، مەزكۇر تور بېكەتنى باش ئېكرانغا ئاسانلا قوشالايسىز. + كىرىش ۋە ئىم @@ -1706,6 +1741,8 @@ ساقلانغان كىرىشلىرىڭىزنى كۆرۈش ئۈچۈن قۇلۇپ ئېچىڭ كىرىش ۋە ئىمنى قوغدايدۇ + + ئۈسكۈنە قۇلۇپلاش ئەندىزىسى، PIN ياكى ئىم ئورنىتىشنى تەڭشىسىڭىز، ئۈسكۈنىڭىز باشقىلارنىڭ قولىدا بولسىمۇ ساقلانغان تىزىمغا كىرىش ئۇچۇرى ۋە ئىمنى زىيارەت قىلالمايدۇ. كېيىنچە @@ -1853,29 +1890,18 @@ يېڭى ئىزدەش موتورى قوش ئىزدەش موتورى تەھرىر - - قوشۇش - - ساقلاش تەھرىرلەش ئۆچۈرۈش - - باشقا - ئىسمى - - ئىسمى ئىزدەش موتورىنىڭ ئىسمى ئىزدەيدىغان تىزىقنىڭ تور ئادرېسى - ئىشلىتىدىغان ئىزدەش تىزىقى - ئىزدەشكە ئىشلىتىدىغان تور ئادرېسى @@ -2098,8 +2124,6 @@ - باھالاش تەكشۈرگۈچ - باھالاش تەكشۈرگۈچ ئىشەنچلىك باھالاش @@ -2113,7 +2137,9 @@ تەڭشەلگەن باھا - ئىشەنچسىز باھا چىقىرىۋېتىلدى + ئىشەنچسىز باھا چىقىرىۋېتىلدى + + ئىشەنچلىك باھالار ئاساس قىلىندى يېقىنقى باھالاردىن يارقىن نۇقتىلار @@ -2125,14 +2151,10 @@ ئىشەنچلىك باھالاش. ئىشىنىمىزكى، بۇ باھالاشنى سەمىمىي، تەرەپسىز ھەقىقىي خېرىدارلار بەرگەن بولۇشى مۇمكىن. - - باھالارنىڭ ئىشەنچلىك ئىكەنلىكىگە ئىشىنىمىز. ئىشەنچلىك ۋە ئىشەنچسىز باھالارنىڭ بارلىقىغا ئىشىنىمىز. ئىشەنچسىز باھالاش. بىز بۇنى ساختا ياكى بىر تەرەپلىمە باھالىغۇچىلار باھالىغان بولۇشى مۇمكىن دەپ قارايمىز. - - بىز باھالارنىڭ ئىشەنچلىك ئەمەسلىكىگە ئىشىنىمىز. تەڭشەلگەن باھا پەقەت بىز ئىشەنچلىك دەپ قارىغان باھالارنىلا ئاساس قىلىدۇ.]]> @@ -2148,9 +2170,6 @@ باھالاش تەكشۈرگۈچتە ئېلان كۆرسىتىدۇ - - مۇناسىۋەتلىك مەھسۇلاتلارنىڭ ئېلانلىرىنى ئاندا-ساندا كۆرىسىز. بارلىق ئېلانلار چوقۇم باھالاش سۈپىتى ئۆلچىمىمىزگە ماس كېلىشى كېرەك. %s - مۇناسىۋەتلىك مەھسۇلاتلارنىڭ ئېلانلىرىنى ئاندا-ساندا كۆرىسىز. بىز پەقەت ئىشەنچلىك باھالانغان مەھسۇلاتلارغا ئېلان بېرىمىز. %s @@ -2176,24 +2195,24 @@ بۇ مەھسۇلاتنىڭ باھالىنىشى تېخىمۇ كۆپ بولغاندا، بىز ئۇلارنىڭ سۈپىتىنى تەكشۈرەلەيمىز. - مەھسۇلات يوق + مەھسۇلات يوق - ئەگەر بۇ مەھسۇلاتتىن مال بارلىقىنى بايقىسىڭىز، دوكلات قىلسىڭىز، بىز باھالاشنى تەكشۈرەلەيمىز. - - بۇ مەھسۇلاتتىن مال بارلىقىنى دوكلات قىلىڭ + ئەگەر بۇ مەھسۇلاتتىن مال بارلىقىنى بايقىسىڭىز، دوكلات قىلسىڭىز، بىز باھالاشنى تەكشۈرەلەيمىز. - مەھسۇلاتنىڭ تىزىلغانلىقىنى دوكلات قىلىڭ + مەھسۇلاتنىڭ تىزىلغانلىقىنى دوكلات قىلىڭ - باھالاش سۈپىتىنى تەكشۈرۈۋاتىدۇ + باھالاش سۈپىتىنى تەكشۈرۈۋاتىدۇ - باھالاش سۈپىتىنى تەكشۈرۈۋاتىدۇ + باھالاش سۈپىتىنى تەكشۈرۈۋاتىدۇ + + باھالاش سۈپىتىنى تەكشۈرۈۋاتىدۇ(%s) بۇنىڭغا 60 سېكۇنت ئەتراپىدا ۋاقىت كېتىشى مۇمكىن. - دوكلات قىلغانلىقىڭىزغا رەھمەت! + دوكلات قىلغانلىقىڭىزغا رەھمەت! - بىز 24 سائەت ئىچىدە بۇ مەھسۇلاتنىڭ باھالىنىشىغا مۇناسىۋەتلىك ئۇچۇرغا ئېرىشىمىز. قايتا كېلىپ تەكشۈرۈپ بېقىڭ. + بىز 24 سائەت ئىچىدە بۇ مەھسۇلاتنىڭ باھالىنىشىغا مۇناسىۋەتلىك ئۇچۇرغا ئېرىشىمىز. قايتا كېلىپ تەكشۈرۈپ بېقىڭ. بۇ باھالاشلارنى تەكشۈرەلمەيمىز @@ -2224,20 +2243,26 @@ مەھسۇلات باھالىنىشغا قارىتا ئىشەنچلىك يېتەكچىمىزنى سىناپ بېقىڭ + + سېتىۋېلىشتىن ئىلگىرى %1$s دا مەھسۇلات باھالاش تەكشۈرۈشنىڭ قانچىلىك ئىشەنچلىك ئىكەنلىكىنى كۆرۈڭ. باھالاش تەكشۈرگۈچ، %2$s نىڭ تەجرىبە ئىقتىدارى تور كۆرگۈچكە قۇرۇلدى. ئۇ %3$s ۋە %4$s دىمۇ ئىشلەيدۇ. + + سېتىۋېلىشتىن ئىلگىرى %1$s دا مەھسۇلات باھالاش تەكشۈرۈشنىڭ قانچىلىك ئىشەنچلىك ئىكەنلىكىنى كۆرۈڭ. باھالاش تەكشۈرگۈچ، %2$s نىڭ تەجرىبە ئىقتىدارى تور كۆرگۈچكە قۇرۇلدى. + + Mozilla قوللايدىغان %1$s بىر تەرەپلىمە ۋە ئىناۋەتسىز باھالاشلاردىن ساقلىنىشىڭىزغا ياردەم بېرىدۇ. بىزنىڭ سۈنئىي ئەقىل مودېلىمىز مال سېتىۋېلىشىڭىزنى قوغداش ئۈچۈن ھەمىشە ياخشىلىنىۋاتىدۇ. %2$s تەپسىلاتى - «ھەئە، سىناپ باقاي» تاللانسا سىز Mozilla نىڭ %2$s ۋە %3$s دىكى %1$s غا قوشۇلغان بولىسىز. + «ھەئە، سىناپ باقاي» تاللانسا سىز Mozilla نىڭ %2$s ۋە %3$s دىكى %1$s غا قوشۇلغان بولىسىز. - «ھەئە، سىناپ باقاي» تاللانسا تۆۋەندىكى %1$s غا قوشۇلغان بولىسىز: + «ھەئە، سىناپ باقاي» تاللانسا تۆۋەندىكى %1$s غا قوشۇلغان بولىسىز: - شەخسىيەت تۈزۈمى + شەخسىيەت تۈزۈمى - شەخسىيەت تۈزۈمى + شەخسىيەت تۈزۈمى - ئىشلىتىش شەرتلىرى + ئىشلىتىش شەرتلىرى - ئىشلىتىش شەرتلىرى + ئىشلىتىش شەرتلىرى ھەئە، سىناپ باقاي @@ -2274,6 +2299,9 @@ رىقابەت كۈچى + + «%s» + يىغ @@ -2289,4 +2317,210 @@ ماقالىنى ئوقۇڭ تەپسىلاتى ئۈچۈن ئۇلانما ئېچىلىدۇ - + + + %s، ماۋزۇ + + + ئۇلانما + + ئۇلانما بار + + + + + + بۇ بەتنى تەرجىمە قىلامدۇ؟ + + %1$s دىكى شەخسىي تەرجىمىلەرنى سىناپ بېقىڭ + + شەخسىي مەخپىيەتلىكىڭىز ئۈچۈن تەرجىمىلەر ئۈسكۈنىڭىزدىن ھەرگىز ئايرىلمايدۇ. پات يېقىندا يېڭى تىل ۋە ياخشىلىنىشلار قوشۇلىدۇ! %1$s + + تەپسىلاتى + + مەنبە تىل + + نىشان تىل + + ھازىر ئەمەس + + تامام + + تەرجىمە + + قايتا سىنا + + تەرجىمە قىلىۋاتىدۇ + + + تەرجىمە قىلىنىۋاتىدۇ + + + تەرجىمە قىلىشتا مەسىلە كۆرۈلدى. قايتا سىناڭ. + + تىلنى يۈكلىيەلمىدى. تور باغلىنىشىڭىزنى تەكشۈرۈپ قايتا سىناڭ. + + كەچۈرۈڭ، بىز تېخى %1$s نى قوللىمايمىز. + + تەپسىلاتى + + + + تەرجىمە تاللانمىلىرى + + ھەمىشە تەرجىمە تەكلىپى بەر + + %1$s نى ھەمىشە تەرجىمە قىلسۇن + + %1$s نى ھەرگىز تەرجىمە قىلمىسۇن + + بۇ تور بەتنى تەرجىمە قىلمىسۇن + + تەرجىمە تەڭشەكلىرى + + + %1$s تەرجىمىسى ھەققىدە + + + + تەرجىمە + + مۇمكىن بولسا تەرجىمە قىلىش تەكلىپى سۇنىدۇ + + سانلىق مەلۇمات تېجەش ھالىتىدە ھەمىشە تىلنى چۈشۈرىدۇ + + تەرجىمە مايىللىقى + + ئاپتوماتىك تەرجىمە + + بۇ تور بېكەتلەرنى تەرجىمە قىلمىسۇن + + تىل چۈشۈر + + + + ئاپتوماتىك تەرجىمە + + + «ھەمىشە تەرجىمە قىل» ۋە «ھەرگىز تەرجىمە قىلما» مايىللىقىدىن باشقۇرىدىغان تىل تاللىنىدۇ. + + + + تەرجىمە قىلىش (كۆڭۈلدىكى) + + %1$s بۇ تىلدىكى تور بېكەتلەرنى تەرجىمە قىلىش تەكلىپى سۇنىدۇ. + + ھەمىشە تەرجىمە قىلسۇن + + بەت يۈكلەنگەندە %1$s بۇ تىلنى ئاپتوماتىك تەرجىمە قىلىدۇ. + + ھەرگىز تەرجىمە قىلمىسۇن + + + %1$s بۇ تىلدىكى تور بېكەتلەرنى تەرجىمە قىلىش تەكلىپىنى ھەرگىز سۇنمايدۇ. + + + + بۇ تور بېكەتلەرنى تەرجىمە قىلمىسۇن + + يېڭى تور بېكەت قوشۇش: تور بېكەتنى زىيارەت قىلىپ تەرجىمە تىزىملىكىدىن «بۇ تور بېكەتنى ھەرگىز تەرجىمە قىلما» تاللىنىدۇ. + + %1$s نى چىقىرىۋەت + + %1$s نى ئۆچۈرەمدۇ؟ + + ئۆچۈر + + ۋاز كەچ + + + + تىللارنى چۈشۈرۈش + + تېخىمۇ تېز ۋە تورسىز تەرجىمە قىلىش ئۈچۈن تىلنى تولۇق چۈشۈرۈڭ. %1$s + + تەپسىلاتى + + قوللايدىغان تىللار + + تەلەپ قىلىنىدۇ + + %1$s (%2$s) + + تىللارنى چۈشۈرۈش + + بارلىق تىللار + + ئۆچۈر + + ئىلگىرىلەش + + چۈشۈر + + تاللانغان + + + %1$s (%2$s) نى ئۆچۈرەمدۇ؟ + + ئەگەر بۇ تىلنى ئۆچۈرسىڭىز، %1$s تەرجىمە قىلغاندا تىلنى قىسمەن ھالدا غەملەككە چۈشۈرىدۇ. + + بارلىق تىللارنى ئۆچۈرەمدۇ (%1$s)؟ + + ئەگەر ھەممە تىلنى ئۆچۈرسىڭىز، %1$s تەرجىمە قىلغاندا تىلنى قىسمەن ھالدا غەملەككە چۈشۈرىدۇ. + + ئۆچۈر + + ۋاز كەچ + + + سانلىق مەلۇمات تېجەش ھالىتىدە چۈشۈرەمدۇ(%1$s)؟ + + تەرجىمىنىڭ شەخسىيىتىنى قوغداش ئۈچۈن، تىل قىسمەن ھالدا غەملىكىڭىزگە چۈشۈرۈلىدۇ. + + سانلىق مەلۇمات تېجەش ھالىتىدە ھەمىشە چۈشۈرىدۇ + + چۈشۈر + + چۈشۈرۈش ۋە تەرجىمە قىلىش + + ۋاز كەچ + + + + سازلاش قورالى + + كەينىگە قايت + + بەتكۈچ قوراللىرى + + بەتكۈچ سانى + + ئاكتىپ + + ئىشلەتمىگەن + + شەخسىيەت + + جەمئىي + + بەتكۈچ قۇرۇش قورالى + + قۇرىدىغان بەتكۈچ سانى + + ئاكتىپ بەتكۈچكە قوش + + ئاكتىپسىز بەتكۈچكە قوش + + شەخسىي بەتكۈچكە قوش + diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index eb7b0df7f355..5fdf81adc4e2 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -68,11 +68,6 @@ Не залишайте слідів на цьому пристрої - - %1$s видаляє ваші куки, історію та дані сайтів, коли ви закриваєте всі приватні вікна. %2$s Знайти на сторінці + + Перекласти сторінку Зберегти до збірки @@ -332,14 +329,8 @@ Не зараз - - Зробіть Firefox своїм щоденним браузером Ми дбаємо про вашу безпеку - - Firefox цінує людей понад прибуток і захищає вашу приватність, блокуючи стеження між сайтами.\n\nДізнайтеся більше у нашому положенні про приватність. Наш некомерційний браузер не дозволяє компаніям таємно стежити за вами в інтернеті.\n\nДокладніше в нашому Положенні про приватність. Не зараз - Перемикайтеся між телефоном і комп’ютером - Ваші дані надійно шифруються на різних пристроях - - Продовжуйте роботу зі своїми вкладками та паролями з інших пристроїв. Ви можете безпечно входити в систему та синхронізувати дані. Firefox шифрує ваші паролі, закладки та іншу інформацію. @@ -362,15 +349,9 @@ Увійти Не зараз - - Сповіщення допомагають вам ефективніше взаємодіяти з Firefox Сповіщення допомагають вам бути в безпеці з Firefox - - Надсилайте вкладки на інші пристрої, керуйте завантаженнями, а також отримуйте поради про можливості Firefox. Безпечно надсилайте вкладки між своїми пристроями та дізнайтеся про інші функції приватності у Firefox. @@ -413,8 +394,6 @@ Оберіть - Керувати ярликами пошуку - Керуйте альтернативними засобами пошуку Редагувати засоби пошуку, доступні в меню @@ -428,8 +407,6 @@ Засоби пошуку Пропозиції засобів пошуку - - Панель адреси Налаштування панелі адреси @@ -553,14 +530,10 @@ Доступність - - Власний сервер облікового запису Firefox Власний сервер облікового запису Mozilla Спеціальний сервер синхронізації - - Сервер Облікового запису/Синхронізації Firefox змінено. Вихід з програми для застосування змін… Сервер облікового запису/синхронізації Mozilla змінено. Вихід з програми для застосування змін… @@ -578,8 +551,6 @@ Увійдіть для синхронізації вкладок, закладок, паролів та інших даних. - Обліковий запис Firefox - Обліковий запис Mozilla Повторно підключіться, щоб відновити синхронізацію @@ -592,8 +563,6 @@ Віддалене налагодження через USB - - Показати засоби пошуку Показувати пошукові пропозиції @@ -726,12 +695,6 @@ Ознайомитися з додатками - - - Додаток не підтримується - - Додаток вже встановлено - Додаток тимчасово вимкнено @@ -1370,6 +1333,11 @@ Закрити приватні вкладки + + + Закрити приватні вкладки? + Торкніться або посуньте це сповіщення, щоб закрити приватні вкладки. + Маркетинг @@ -1606,6 +1574,8 @@ Усі куки (буде пошкоджувати роботу вебсайтів) Ізолювати куки сторонніх сайтів + + Вказувати вебсайтам не ділитися й не продавати мої дані Вміст стеження @@ -1682,7 +1652,7 @@ Збої - Повідомлення про приватність + Положення про приватність Знайте свої права @@ -1946,28 +1916,18 @@ Додати новий засіб пошуку Змінити засіб пошуку - - Додати - - Зберегти Змінити Видалити - - Інший Назва - - Назва Назва засобу пошуку URL рядка пошуку - Запит для пошуку - URL для пошуку Змініть запит на “%s”. Зразок:\nhttps://www.google.com/search?q=%s @@ -2197,8 +2157,6 @@ - Засіб перевірки відгуків - Засіб перевірки відгуків Надійні відгуки @@ -2211,7 +2169,9 @@ Скоригований рейтинг - Сумнівні відгуки прибрано + Сумнівні відгуки прибрано + + На основі надійних відгуків Обране з недавніх відгуків @@ -2222,14 +2182,10 @@ буквену оцінку від A до F.]]> Надійні – чесні, неупереджені відгуки, найімовірніше від справжніх замовників. - - Ми вважаємо ці відгуки надійними. Ми вважаємо, що тут поєднано надійні та сумнівні відгуки. Сумнівні – нечесні відгуки, найімовірніше від упереджених оглядачів. - - Ми вважаємо ці відгуки ненадійними. Скоригований рейтинг на основі лише відгуків, які ми вважаємо надійними.]]> @@ -2245,8 +2201,6 @@ Показувати рекламу в засобі перевірки - Ви періодично бачитимете рекламу схожих товарів. Усі оголошення мають відповідати нашим стандартам якості відгуків. %s - Ви періодично бачитимете рекламу відповідних товарів. Ми рекламуємо лише товари з надійними відгуками. %s Докладніше @@ -2269,23 +2223,23 @@ Коли на цей продукт буде більше відгуків, ми зможемо їх проаналізувати. - Товар відсутній + Товар відсутній - Якщо цей товар знову з’явиться, повідомте про це нам, і ми його проаналізуємо. + Якщо цей товар знову з’явиться, повідомте про це нам, і ми його проаналізуємо. - Повідомити, що цей товар знову в наявності - - Повідомити про наявність товару + Повідомити про наявність товару - Перевірка якості відгуку + Перевірка якості відгуку - Перевірка якості відгуку + Перевірка якості відгуку + + Перевірка якості відгуку (%s) Це може тривати близько 60 секунд. - Дякуємо за повідомлення! + Дякуємо за повідомлення! - Оновлені результати мають з’явитися впродовж 24 годин. Перевірте знову пізніше. + Оновлені результати мають з’явитися впродовж 24 годин. Перевірте знову пізніше. Ми не можемо перевірити ці відгуки @@ -2323,17 +2277,17 @@ Докладніше - Вибравши “Так, спробувати”, ви погоджуєтеся з %1$s %2$s і %3$s від Mozilla. + Вибравши “Так, спробувати”, ви погоджуєтеся з %1$s %2$s і %3$s від Mozilla. - Вибираючи “Спробувати”, ви погоджуєтеся з такими умовами від %1$s: + Вибираючи “Спробувати”, ви погоджуєтеся з такими умовами від %1$s: - політикою приватності + політикою приватності - Політика приватності + Політика приватності - умовами користування + умовами користування - Умови користування + Умови користування Так, спробувати @@ -2370,6 +2324,9 @@ Конкурентоспроможність + + “%s“ + згорнути @@ -2387,4 +2344,207 @@ відкрити посилання, щоб дізнатися більше %s, заголовок + + + Посилання + + Доступні посилання + + + + + + Перекласти цю сторінку? + + Спробуйте приватні переклади у %1$s + + Для вашої приватності переклади завжди відбуваються на пристрої. Невдовзі з’являться нові мови та вдосконалення! %1$s + + Докладніше + + Перекласти з + + Перекласти мовою + + Не зараз + + Готово + + Перекласти + + Спробувати знову + + Переклад + + Виконується переклад + + + Виникла проблема з перекладом. Повторіть спробу. + + Не вдалося завантажити мови. Перевірте інтернет-з’єднання і повторіть спробу. + + На жаль, %1$s ще не підтримується. + + Докладніше + + + + Параметри перекладу + + Завжди пропонувати переклад + + Завжди перекладати %1$s + + Ніколи не перекладати %1$s + + Ніколи не перекладати цей сайт + + Налаштування перекладу + + + Про переклади в %1$s + + + + Переклади + + Пропонувати переклад, коли це можливо + + Завжди завантажувати мови в режимі збереження даних + + Налаштування перекладу + + Автоматичний переклад + + Ніколи не перекладати ці сайти + + Завантажити мови + + + + Автоматичний переклад + + + Виберіть мову, щоб керувати налаштуваннями ”завжди перекладати“ та ”ніколи не перекладати“. + + + + Пропонувати переклад (типово) + + %1$s пропонуватиме переклад для сайтів цією мовою. + + Завжди перекладати + + %1$s автоматично перекладатиме цю мову під час завантаження сторінки. + + Ніколи не перекладати + + + %1$s ніколи не пропонуватиме переклад для сайтів цією мовою. + + + + Ніколи не перекладати ці сайти + + + Щоб додати новий сайт: відкрийте його і в меню перекладу виберіть “Ніколи не перекладати цей сайт”. + + Вилучити %1$s + + Видалити %1$s? + + Видалити + + Скасувати + + + + Завантажити мови + + Завантажте мови для швидшого перекладу офлайн. %1$s + + Докладніше + + Доступні мови + + обов’язково + + %1$s (%2$s) + + Завантажити мови + + Усі мови + + Видалити + + Виконується + + Завантажити + + Вибрано + + + Видалити %1$s (%2$s)? + + Якщо ви видалите цю мову, %1$s завантажуватиме частину словників у ваш кеш під час перекладу. + + Видалити всі мови (%1$s)? + + Якщо ви видалите всі мови, %1$s завантажуватиме частину словників у ваш кеш під час перекладу. + + Видалити + + Скасувати + + + Завантажувати в режимі заощадження даних (%1$s)? + + Ми завантажуємо частину словників у ваш кеш, щоб зберегти приватність перекладів. + + Завжди завантажувати в режимі заощадження даних + + Завантажити + + Завантажити і перекласти + + Скасувати + + + + Інструменти налагодження + + Перейти назад + + Інструменти вкладки + + Кількість вкладок + + Активні + + Неактивні + + Приватні + + Усього + + Інструмент створення вкладок + + Кількість вкладок для створення + + Додати до активних вкладок + + Додати до неактивних вкладок + + Додати до приватних вкладок diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index cc346e7c954d..1724ee763ba3 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -56,7 +56,7 @@ Xóa - %1$s được sáng lập bởi Mozilla. + %1$s - Một sản phẩm của Mozilla. Không để lại dấu vết trên thiết bị này - - %1$s xóa cookie, lịch sử và dữ liệu trang web của bạn khi bạn đóng tất cả các cửa sổ riêng tư của mình. %2$s Khởi chạy thẻ riêng tư tiếp theo của bạn chỉ bằng một lần nhấn. - Thêm vào màn hình chính + Thêm vào Màn hình chính Không, cảm ơn @@ -155,13 +150,13 @@ Trang đã xem gần đây - Hiển thị tất cả + Xem tất cả Hiển thị nút tất cả các thẻ gần đây - Xem các thẻ đã đồng bộ hóa + Xem tất cả các thẻ đã đồng bộ hóa Thiết bị được đồng bộ hóa @@ -216,6 +211,8 @@ Đồng bộ hóa lại Tìm trong trang + + Dịch trang Lưu vào bộ sưu tập @@ -244,7 +241,7 @@ Chỉnh sửa - Tùy chỉnh trang chủ + Tùy biến trang chủ Màn hình chính @@ -294,7 +291,7 @@ - Gặp gỡ trang chủ được cá nhân hóa của bạn. Các thẻ, dấu trang và kết quả tìm kiếm gần đây sẽ xuất hiện ở đây. + Khám phá trang chủ được cá nhân hóa của bạn. Các thẻ gần đây, dấu trang và các kết quả tìm kiếm của bạn sẽ xuất hiện ngay đây. Chào mừng bạn đến với một Internet cá nhân hơn @@ -302,7 +299,7 @@ Chuyển đổi màn hình dễ dàng hơn bao giờ hết - Tiếp tục nơi bạn đã dừng lại với các thẻ từ các thiết bị khác ngay bây giờ trên trang chủ của bạn. + Tiếp tục với các thẻ mà bạn đang truy cập từ các thiết bị khác ngay trên trang chủ này. Bắt đầu @@ -329,16 +326,11 @@ Không phải bây giờ - - Đặt Firefox làm trình duyệt của bạn - Chúng tôi thích việc giữ an toàn cho bạn - - Firefox đặt mọi người lên trên lợi nhuận và bảo vệ quyền riêng tư của bạn bằng cách chặn các trình theo dõi trên nhiều trang web.\n\nTìm hiểu thêm trong thông báo về quyền riêng tư của chúng tôi. + Chúng tôi thích giữ an toàn cho bạn - Trình duyệt được hỗ trợ phi lợi nhuận của chúng tôi giúp ngăn chặn các công ty bí mật theo dõi bạn trên web.\n\nTìm hiểu thêm trong thông báo về quyền riêng tư của chúng tôi. + Trình duyệt được tài trợ bởi tổ chức phi lợi nhuận của chúng tôi giúp ngăn các công ty bí mật theo dõi bạn trên web.\n\nTìm hiểu thêm về thông báo quyền riêng tư của chúng tôi. + thông báo bảo mật @@ -347,11 +339,7 @@ Không phải bây giờ - Chuyển từ điện thoại sang máy tính xách tay và ngược lại - - Luôn được mã hóa khi bạn chuyển đổi giữa các thiết bị - - Lấy các thẻ và mật khẩu từ các thiết bị khác của bạn để tiếp tục nơi bạn đã dừng lại. + Luôn mã hóa khi bạn chuyển đổi giữa nhiều thiết bị Khi bạn đăng nhập và đồng bộ hóa, bạn sẽ an toàn hơn. Firefox mã hóa mật khẩu, dấu trang của bạn và hơn thế nữa. @@ -359,15 +347,9 @@ Đăng nhập Không phải bây giờ - - Thông báo giúp bạn làm được nhiều việc hơn với Firefox Thông báo giúp bạn an toàn hơn với Firefox - - Gửi các thẻ giữa các thiết bị, quản lý tải xuống và nhận các mẹo để tận dụng tối đa Firefox. Gửi các thẻ giữa các thiết bị của bạn một cách an toàn và khám phá các tính năng bảo mật khác trong Firefox. @@ -409,8 +391,6 @@ Chọn một - Quản lý lối tắt tìm kiếm - Quản lý công cụ tìm kiếm thay thế Chỉnh sửa công cụ tìm kiếm hiển thị trong menu tìm kiếm @@ -424,8 +404,6 @@ Công cụ tìm kiếm Đề xuất từ công cụ tìm kiếm - - Thanh địa chỉ Tùy chọn thanh địa chỉ @@ -450,9 +428,9 @@ Mở liên kết trong thẻ riêng tư - Cho phép chụp ảnh màn hình trong trình duyệt riêng tư + Cho phép chụp ảnh màn hình trong chế độ riêng tư - Nếu được phép, các thẻ riêng tư cũng sẽ hiển thị khi nhiều ứng dụng đang mở + Nếu bạn cho phép, các thẻ riêng tư cũng sẽ hiển thị trong danh sách ứng dụng đang mở Thêm lối tắt duyệt web riêng tư @@ -488,7 +466,7 @@ Đã gửi yêu cầu hỗ trợ - Trang web hiện không được hỗ trợ + Trang web hiện tại không được hỗ trợ Bật giảm biểu ngữ cookie cho %1$s? @@ -523,7 +501,7 @@ %1$s vừa từ chối cookie cho bạn - Ít phiền nhiễu hơn, ít cookie theo dõi bạn trên trang web này hơn. + Ít phiền nhiễu hơn, ít cookie theo dõi bạn hơn trên trang web này. Tự động cố gắng kết nối với các trang web bằng giao thức mã hóa HTTPS để tăng cường bảo mật. @@ -547,14 +525,10 @@ Tuy nhiên, cũng có thể có kẻ tấn công tham gia. Nếu bạn tiếp tục vào trang web, bạn không nên nhập bất kỳ thông tin nhạy cảm nào. Nếu bạn tiếp tục, chế độ chỉ HTTPS sẽ tạm thời bị tắt cho trang web. Khả năng truy cập - - Tùy chỉnh máy chủ tài khoản Firefox Máy chủ tài khoản Mozilla tùy chỉnh Tùy chỉnh máy chủ đồng bộ hóa - - Tài khoản máy chủ Firefox/đồng bộ hóa đã thay đổi. Thoát ứng dụng để áp dụng thay đổi… Đã sửa đổi máy chủ/tài khoản đồng bộ hóa Mozilla. Đang thoát khỏi ứng dụng để áp dụng các thay đổi… @@ -572,8 +546,6 @@ Đăng nhập để đồng bộ các thẻ, dấu trang, mật khẩu, v.v. - Tài khoản Firefox - Tài khoản Mozilla Kết nối lại để tiếp tục đồng bộ hóa @@ -585,8 +557,6 @@ Thu thập dữ liệu Gỡ lỗi từ xa qua USB - - Hiển thị công cụ tìm kiếm Hiển thị đề xuất tìm kiếm @@ -684,7 +654,7 @@ Đã cập nhật hình nền! - Hiển thị + Xem ngay Không thể tải xuống hình nền @@ -705,7 +675,7 @@ Thử một chút màu sắc - Chọn một hình nền nói lên bạn. + Chọn một hình nền để nói lên phong cách của bạn. Khám phá các hình nền khác @@ -717,12 +687,6 @@ Khám phá tiện ích - - - Tiện ích mở rộng không được hỗ trợ - - Tiện ích mở rộng đã được cài đặt trước đó - Tiện ích mở rộng tạm thời bị vô hiệu hóa @@ -759,13 +723,13 @@ Đang đồng bộ hóa… - Đồng bộ hóa thất bại. Thành công lần cuối: %s + Đồng bộ hóa thất bại. Lần thành công gần nhất: %s - Đồng bộ hóa thất bại. Đồng bộ hóa lần cuối: không rõ + Đồng bộ hóa thất bại. Lần đồng bộ gần nhất: không có Đồng bộ hóa lần cuối: %s - Đồng bộ hóa lần cuối: không rõ + Lần đồng bộ gần nhất: không có - Ngoại trừ + Ngoại lệ Bật cho tất cả các trang web - Các ngoại trừ cho phép bạn vô hiệu hóa trình chống theo dõi cho các trang web được chọn. + Các ngoại lệ cho phép bạn tắt trình chống theo dõi cho các trang web đã chọn. Tìm hiểu thêm @@ -825,9 +789,9 @@ - Trên cùng + Phía trên - Dưới cùng + Phía dưới @@ -837,13 +801,13 @@ Đặt theo trình tiết kiệm pin - Đặt theo chủ đề thiết bị + Theo chủ đề thiết bị - Kéo để làm mới + Kéo trang để làm mới - Cuộn để ẩn thanh công cụ + Cuộn trang để ẩn thanh công cụ Vuốt thanh công cụ sang hai bên để chuyển đổi các thẻ @@ -893,7 +857,7 @@ Các thẻ đã đóng gần đây - Hiển thị toàn bộ lịch sử + Hiện toàn bộ lịch sử %d thẻ @@ -955,7 +919,7 @@ Chuyển các thẻ cũ sang không hoạt động - Các thẻ bạn đã không xem trong hai tuần sẽ được chuyển sang phần không hoạt động. + Các thẻ mà bạn chưa xem trong hai tuần sẽ được chuyển vào phần không hoạt động. @@ -1213,7 +1177,7 @@ Bị chặn bởi Android - Ngoại trừ + Ngoại lệ Tắt @@ -1320,7 +1284,7 @@ Mọi hành động - Được sử dụng gần đây + Sử dụng gần đây Sao chép vào khay nhớ tạm @@ -1355,6 +1319,11 @@ Đóng các thẻ riêng tư + + + Đóng các thẻ riêng tư? + Nhấn hoặc vuốt thông báo này để đóng các thẻ riêng tư. + Tiếp thị @@ -1483,7 +1452,7 @@ Khoảng thời gian để xóa - Xóa lịch sử (bao gồm cả lịch sử được đồng bộ hóa từ các thiết bị khác), cookie và dữ liệu duyệt web khác. + Xóa lịch sử (bao gồm lịch sử đã đồng bộ hóa từ các thiết bị khác), cookie và dữ liệu duyệt web khác. Xóa lịch sử (bao gồm lịch sử đã đồng bộ hóa từ thiết bị khác) @@ -1515,7 +1484,7 @@ - Đồng bộ hóa được bật + Đồng bộ hóa đang bật @@ -1537,7 +1506,7 @@ Sử dụng email thay thế - Tạo một cái để đồng bộ hóa Firefox giữa các thiết bị.]]> + Tạo ngay tài khoản mới để đồng bộ hóa Firefox giữa các thiết bị.]]> %s sẽ ngừng đồng bộ hóa với tài khoản của bạn, nhưng sẽ không xóa bất kỳ dữ liệu duyệt web nào của bạn trên thiết bị này. @@ -1553,9 +1522,9 @@ Trình chống theo dõi nâng cao - Hiện có tính năng Trình chống cookie chung, rào cản mạnh mẽ nhất của chúng tôi đối với các trình theo dõi trên nhiều trang web. + Bây giờ với tính năng Trình chống cookie chung, hàng rào mạnh mẽ nhất của chúng tôi đối với các trình theo dõi trên nhiều trang web. - %s bảo vệ bạn khỏi nhiều trình theo dõi phổ biến nhất theo dõi những gì bạn làm trực tuyến. + %s bảo vệ bạn khỏi các trình theo dõi phổ biến nhất đang theo dõi những điều bạn làm trên internet. Tìm hiểu thêm @@ -1567,7 +1536,7 @@ Nghiêm ngặt - Trình chống theo dõi mạnh mẽ hơn và hiệu suất nhanh hơn, nhưng một số trang web có thể không hoạt động đúng. + Trình chống theo dõi mạnh mẽ hơn và hiệu suất nhanh hơn, nhưng có thể làm hỏng một số trang web. Những gì bị chặn bởi trình chống theo dõi nghiêm ngặt @@ -1582,13 +1551,15 @@ Trình theo dõi chéo và truyền thông xã hội - Cookie từ các trang không mong muốn + Cookie từ các trang web chưa truy cập - Tất cả cookie của bên thứ ba (có thể khiến các trang web bị hỏng) + Tất cả cookie của bên thứ ba (có thể làm hỏng các trang web) - Tất cả các cookie (có thể khiến các trang web bị hỏng) + Tất cả cookie (có thể làm hỏng các trang web) Cô lập cookie trên nhiều trang web + + Yêu cầu trang web không bán hay chia sẻ dữ liệu cá nhân của tôi Trình theo dõi nội dung @@ -1608,27 +1579,27 @@ Trình theo dõi truyền thông xã hội - Hạn chế khả năng của các mạng xã hội mà nó theo dõi hoạt động duyệt web của bạn trên web. + Hạn chế các mạng xã hội theo dõi hoạt động duyệt web của bạn trên internet. Cookie theo dõi chéo trang web Cookie trên nhiều trang web - Chặn cookie mà các mạng quảng cáo và công ty phân tích sử dụng mà nó biên dịch dữ liệu duyệt web của bạn trên nhiều trang web. + Chặn các cookie mà các mạng quảng cáo và công ty phân tích sử dụng để thu thập dữ liệu duyệt web của bạn trên nhiều trang web. - Trình chống cookie chung cô lập các cookie với trang web mà bạn đang truy cập, do đó, những người theo dõi như mạng quảng cáo không thể sử dụng chúng để theo dõi bạn trên các trang web. + Trình chống cookie chung cô lập các cookie với trang web mà bạn đang truy cập, do đó, các trình theo dõi như quảng cáo không thể sử dụng chúng để theo dõi bạn trên các trang web. Tiền điện tử - Ngăn chặn các tập lệnh độc hại có quyền truy cập vào thiết bị của bạn mà nó khai thác tiền kỹ thuật số. + Ngăn chặn các tập lệnh độc hại truy cập vào thiết bị của bạn để khai thác tiền điện tử. Vân tay - Dừng dữ liệu nhận dạng duy nhất khỏi bị thu thập về thiết bị của bạn có thể được sử dụng cho mục đích theo dõi. + Ngăn chặn việc thu thập dữ liệu nhận dạng duy nhất về thiết bị của bạn có thể được sử dụng cho mục đích theo dõi. Trình theo dõi nội dung - Dừng quảng cáo bên ngoài, video và nội dung khác từ tải có chứa mã theo dõi. Có thể ảnh hưởng đến một số chức năng trang web. + Chặn các trình theo dõi từ quảng cáo, video và nội dung khác từ bên ngoài. Có thể ảnh hưởng đến một số chức năng của trang web. Bảo vệ đã BẬT cho trang web này @@ -1657,7 +1628,7 @@ - Biểu tượng tùy chọn ngoại trừ trình chống theo dõi nâng cao + Biểu tượng tùy chọn ngoại lệ trình chống theo dõi nâng cao Hỗ trợ @@ -1732,13 +1703,13 @@ Tìm hiểu thêm về đồng bộ hóa. - Ngoại trừ + Ngoại lệ Thông tin đăng nhập và mật khẩu không được lưu sẽ được hiển thị ở đây. Thông tin đăng nhập và mật khẩu sẽ không được lưu cho các trang web này. - Xóa tất cả các ngoại trừ + Xóa tất cả ngoại lệ Tìm thông tin đăng nhập @@ -1780,7 +1751,7 @@ Mở khóa thiết bị của bạn - Phóng to tất cả các trang web + Thu phóng trên mọi trang web Cho phép để chụm và thu phóng, ngay cả trên các trang web ngăn chặn cử chỉ này. @@ -1924,28 +1895,18 @@ Thêm công cụ tìm kiếm mới Chỉnh sửa công cụ tìm kiếm - - Thêm - - Lưu Chỉnh sửa Xóa - - Khác Tên - - Tên Tên công cụ tìm kiếm Chuỗi URL tìm kiếm - Chuỗi tìm kiếm để sử dụng - URL để sử dụng cho tìm kiếm Thay thế chuỗi truy vấn thành “%s”. Ví dụ:\nhttps://www.google.com/search?q=%s @@ -1995,11 +1956,11 @@ %s không?]]> - Bạn có chắc chắn rằng bạn muốn xóa tất cả các quyền hạn trên tất cả các trang web? + Bạn có thật sự muốn xóa tất cả quyền hạn trên mọi trang web? - Bạn có chắc chắn rằng bạn muốn xóa tất cả các quyền hạn cho trang web này? + Bạn có thật sự muốn xóa tất cả quyền hạn cho trang web này? - Bạn có chắc chắn rằng bạn muốn xóa quyền hạn này cho trang web này? + Bạn có thật sự muốn xóa quyền hạn này cho trang web này? Không có ngoại lệ trang web @@ -2062,7 +2023,7 @@ Vui lòng xác thực lại. - Vui lòng kích hoạt đồng bộ hóa thẻ. + Vui lòng bật đồng bộ hóa thẻ. Bạn không có bất kỳ thẻ nào mở trong Firefox trên các thiết bị khác của bạn. @@ -2174,8 +2135,6 @@ - Trình kiểm tra đánh giá - Trình kiểm tra đánh giá Đánh giá đáng tin cậy @@ -2188,7 +2147,9 @@ Đánh giá đã được điều chỉnh - Đã xóa các đánh giá không đáng tin cậy + Đã xóa các đánh giá không đáng tin cậy + + Dựa trên những đánh giá đáng tin cậy Điểm nổi bật từ các đánh giá gần đây @@ -2199,14 +2160,10 @@ điểm bằng chữ cái từ A đến F.]]> Đánh giá đáng tin cậy. Chúng tôi tin rằng các đánh giá có thể đến từ những khách hàng thực sự đã để lại những đánh giá trung thực, không thiên vị. - - Chúng tôi tin rằng các đánh giá là đáng tin cậy. Chúng tôi tin rằng có sự kết hợp giữa các đánh giá đáng tin cậy và không đáng tin cậy. Đánh giá không đáng tin cậy. Chúng tôi tin rằng các đánh giá có thể là giả mạo hoặc từ những người đánh giá thiên vị. - - Chúng tôi tin rằng các đánh giá là không đáng tin cậy. Đánh giá đã được điều chỉnh chỉ dựa trên những đánh giá mà chúng tôi tin là đáng tin cậy.]]> @@ -2220,9 +2177,7 @@ Cài đặt - Hiển thị quảng cáo trong trình kiểm tra đánh giá - - Bạn sẽ thấy quảng cáo không thường xuyên cho các sản phẩm có liên quan. Tất cả quảng cáo phải đáp ứng tiêu chuẩn chất lượng đánh giá của chúng tôi. %s + Hiện quảng cáo trong bài kiểm tra đánh giá Bạn sẽ thấy quảng cáo không thường xuyên cho các sản phẩm có liên quan. Chúng tôi chỉ quảng cáo những sản phẩm có đánh giá đáng tin cậy. %s @@ -2246,23 +2201,23 @@ Khi sản phẩm này có nhiều đánh giá hơn, chúng tôi sẽ có thể kiểm tra chất lượng của chúng. - Sản phẩm không có sẵn + Sản phẩm không có sẵn - Nếu bạn thấy sản phẩm này đã có hàng trở lại, hãy báo cáo và chúng tôi sẽ kiểm tra đánh giá. + Nếu bạn thấy sản phẩm này đã có hàng trở lại, hãy báo cáo và chúng tôi sẽ kiểm tra đánh giá. - Báo sản phẩm này đã có hàng trở lại - - Báo sản phẩm còn hàng + Báo sản phẩm còn hàng - Đang kiểm tra chất lượng đánh giá + Đang kiểm tra chất lượng đánh giá - Đang kiểm tra chất lượng đánh giá + Đang kiểm tra chất lượng đánh giá + + Kiểm tra chất lượng đánh giá (%s) Quá trình này có thể mất khoảng 60 giây. - Cảm ơn bạn đã báo cáo! + Cảm ơn bạn đã báo cáo! - Chúng tôi sẽ có thông tin về đánh giá của sản phẩm này trong vòng 24 giờ. Hãy kiểm tra lại sau. + Chúng tôi sẽ có thông tin về đánh giá của sản phẩm này trong vòng 24 giờ. Hãy kiểm tra lại sau. Chúng tôi không thể kiểm tra những đánh giá này @@ -2300,17 +2255,17 @@ Tìm hiểu thêm - Bằng cách chọn “Có, hãy thử nó” bạn đã đồng ý với %2$s và %3$s của %1$s bởi Mozilla. + Bằng cách chọn “Có, hãy thử nó” bạn đã đồng ý với %2$s và %3$s của %1$s bởi Mozilla. - Bằng cách chọn “Có, dùng thử nó”, bạn đồng ý với những điều sau từ %1$s: + Bằng cách chọn “Có, dùng thử nó”, bạn đồng ý với những điều sau từ %1$s: - chính sách riêng tư + chính sách riêng tư - Chính sách riêng tư + Chính sách riêng tư - điều khoản sử dụng + điều khoản sử dụng - Điều khoản sử dụng + Điều khoản sử dụng Có, hãy thử nó @@ -2347,6 +2302,9 @@ Tính cạnh tranh + + “%s” + thu gọn @@ -2364,4 +2322,205 @@ mở liên kết để tìm hiểu thêm %s, Tiêu đề + + + Liên kết + + Liên kết khả dụng + + + + + + Dịch trang này? + + Hãy thử bản dịch riêng tư trong %1$s + + Vì riêng tư của bạn, bản dịch sẽ không bao giờ rời khỏi thiết bị của bạn. Sắp có các ngôn ngữ và cải tiến mới! %1$s + + Tìm hiểu thêm + + Dịch từ + + Dịch sang + + Không phải bây giờ + + Xong + + Dịch + + Thử lại + + Đang dịch + + Đang dịch trang + + + Đã xảy ra sự cố khi dịch. Hãy thử lại. + + Không thể tải ngôn ngữ. Hãy kiểm tra kết nối Internet của bạn và thử lại. + + Rất tiếc, chúng tôi chưa hỗ trợ %1$s. + + Tìm hiểu thêm + + + + Tuỳ chọn dịch + + Luôn đề nghị dịch + + Luôn dịch %1$s + + Không bao giờ dịch %1$s + + Không bao giờ dịch trang này + + Cài đặt dịch + + Về dịch thuật trong %1$s + + + + Dịch + + Đề nghị dịch khi có thể + + Luôn tải xuống ngôn ngữ khi ở chế độ tiết kiệm dữ liệu + + Tùy chọn dịch + + Dịch tự động + + Không bao giờ dịch các trang này + + Tải xuống ngôn ngữ + + + + Dịch tự động + + + Hãy chọn một ngôn ngữ để quản lí các tùy chọn ”Luôn dịch“ và ”Không bao giờ dịch“. + + + + Đề xuất dịch (mặc định) + + %1$s sẽ đề xuất dịch các trang web bằng ngôn ngữ này. + + Luôn dịch + + %1$s sẽ tự động dịch ngôn ngữ này khi tải trang. + + Không bao giờ dịch + + + %1$s sẽ không bao giờ đề nghị dịch các trang web bằng ngôn ngữ này. + + + + Không bao giờ dịch các trang này + + Để thêm một trang mới: Hãy truy cập trang đó và chọn “Không bao giờ dịch trang này” từ menu dịch. + + Xóa %1$s + + Xóa %1$s? + + Xóa + + Hủy bỏ + + + + Tải xuống các ngôn ngữ + + Tải xuống ngôn ngữ hoàn chỉnh để dịch nhanh hơn và dịch ngoại tuyến. %1$s + + Tìm hiểu thêm + + Ngôn ngữ có sẵn + + yêu cầu + + %1$s (%2$s) + + Tải xuống ngôn ngữ + + Tất cả ngôn ngữ + + Xóa + + Trong tiến trình + + Tải xuống + + Đã chọn + + + Xoá %1$s (%2$s)? + + Nếu bạn xóa ngôn ngữ này, %1$s sẽ tải xuống một phần ngôn ngữ xuống bộ nhớ đệm của bạn khi bạn dịch. + + Xóa tất cả ngôn ngữ (%1$s)? + + Nếu bạn xóa tất cả ngôn ngữ, %1$s sẽ tải một phần ngôn ngữ xuống bộ nhớ đệm của bạn khi bạn dịch. + + Xóa + + Hủy bỏ + + + Tải xuống khi đang ở chế độ tiết kiệm dữ liệu (%1$s)? + + Chúng tôi tải một phần ngôn ngữ xuống bộ nhớ đệm của bạn để giữ bản dịch ở chế độ riêng tư. + + Luôn tải xuống khi ở chế độ tiết kiệm dữ liệu + + Tải xuống + + Tải xuống và dịch + + Hủy bỏ + + + + Công cụ gỡ lỗi + + Điều hướng quay lại + + Công cụ thẻ + + Số lượng thẻ + + Hoạt động + + Không hoạt động + + Riêng tư + + Tổng + + Công cụ tạo thẻ + + Số lượng thẻ cần tạo + + Thêm vào thẻ đang hoạt động + + Thêm vào thẻ không hoạt động + + Thêm vào thẻ riêng tư diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index a9e003846297..a89e7bfeff17 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -72,11 +72,6 @@ 不在设备上留痕迹 - - %1$s 会在您关闭所有隐私窗口后删除 Cookie、历史记录、网站数据。%2$s 在页面中查找 + + 翻译页面 保存到收藏集 @@ -305,7 +302,7 @@ - 认识您的个性化主页。这里将显示最近的标签页、书签和搜索结果。 + 这里就是您的个性化主页。最近使用的标签页、书签、搜索结果会显示在这里。 欢迎进入更个性化的互联网 @@ -340,14 +337,8 @@ 暂时不要 - - 将 Firefox 设为主力浏览器 我们乐于为您护航 - - Firefox 始终以人为本,并通过拦截跨站跟踪器等机制保护您的隐私。\n\n可阅读我们的隐私声明详细了解 这款由非营利组织支持的浏览器会自动阻止大公司在网上偷偷跟踪您。\n\n请阅读我们的隐私声明详细了解。 暂时不要 - 全平台快速切换 - 在设备间流转,数据照样密不透风 - - 同步您其他设备上的标签页和密码,从中断的地方继续浏览。 登录并同步,安全再升级。Firefox 会加密您的密码、书签等数据。 @@ -370,15 +357,9 @@ 登录 暂时不要 - - 允许通知可以让 Firefox 更贴心好用 允许通知可让 Firefox 更好地为您保驾护航 - - 在设备之间传输标签页、管理下载,解锁 Firefox 完整体验。 在设备间安全发送标签页,并探索 Firefox 中更多保护隐私的特色功能。 @@ -423,8 +404,6 @@ 选择一个 - 管理搜索快捷方式 - 管理备用搜索引擎 编辑在搜索菜单中显示的搜索引擎 @@ -438,8 +417,6 @@ 搜索引擎 来自搜索引擎的建议 - - 地址栏 地址栏首选项 @@ -562,14 +539,10 @@ 然而也可能是受到网络攻击。若您要继续访问此网站,则不应输入任何敏感信息。若继续,将暂时为此网站关闭 HTTPS-Only 模式。 无障碍环境 - - 自定义 Firefox 账户服务器 自定义 Mozilla 账户服务器 自定义同步服务器 - - 已更改 Firefox 账户/同步服务器设置。退出应用程序以应用更改… 已更改 Mozilla 账户/同步服务器设置。正在退出应用程序以应用更改… @@ -587,8 +560,6 @@ 登录后即可同步标签页、书签、密码等数据。 - Firefox 账户 - Mozilla 账户 重新连接以恢复同步 @@ -600,8 +571,6 @@ 数据收集 通过 USB 远程调试 - - 显示搜索引擎 显示搜索建议 @@ -735,12 +704,6 @@ 探索附加组件 - - - 不支持的附加组件 - - 附加组件已安装 - 附加组件已暂时被禁用 @@ -1403,6 +1366,11 @@ 关闭隐私标签页 + + + 要关闭隐私标签页吗? + 点按或轻扫此通知,即可关闭隐私标签页。 + 市场营销 @@ -1647,6 +1615,8 @@ 所有 Cookie(将会导致网站异常) 隔离跨站 Cookie + + 要求网站不共享和不出售我的数据 跟踪性内容 @@ -1767,7 +1737,7 @@ 询问是否保存 - 总不保存 + 永不保存 在 %1$s 中自动填充 @@ -1860,11 +1830,11 @@ 信用卡 - 保存并自动填充卡片信息 + 保存并自动填充信用卡信息 数据已加密 - 跨设备同步卡片信息 + 跨设备同步信用卡信息 同步卡片信息 @@ -1888,7 +1858,7 @@ 卡号 - 失效日期 + 有效期 到期月份 @@ -1987,31 +1957,21 @@ 添加新搜索引擎 编辑搜索引擎 - - 添加 - - 保存 编辑 删除 - - 其他 名称 - - 名称 搜索引擎名称 - 搜索字符串 URL + 搜索字符串网址 - 搜索字符串 - - 用于搜索的 URL + 用于搜索的网址 - 用“%s”替换查询关键字。示例:\nhttps://www.google.com/search?q=%s + 用“%s”代表查询关键字。示例:\nhttps://www.google.com/search?q=%s 自定义搜索引擎信息 @@ -2021,7 +1981,7 @@ 搜索建议 API 网址 - 用“%s”代表搜索词。示例:\nhttps://suggestqueries.google.com/complete/search?client=firefox&q=%s + 用“%s”代表查询关键字。示例:\nhttps://suggestqueries.google.com/complete/search?client=firefox&q=%s 保存 @@ -2237,8 +2197,6 @@ - 核查评价 - 核查评价 可信评价 @@ -2251,7 +2209,9 @@ 调整后的评分 - 已排除不可信的评价 + 已排除不可信的评价 + + 基于可信评价调整 最有帮助的近期评价 @@ -2262,15 +2222,11 @@ 字母等级(从 A 到 F)给商品评价打分。]]> 评价可信。分析认为这些评价大概率是由真实消费者作出的诚实公正的评价。 - - 分析认为这些评价真实可信。 分析认为对此商品的评价鱼龙混杂。 评价不可信。分析认为这些评价大概率不实,或是由“水军”所作出。 - - 分析认为这些评价不可信。 调整后的评分仅基于我们认为可信的评价作出。]]> @@ -2286,8 +2242,6 @@ 在核查评价中展示广告 - - 您偶尔会看到相关商品的广告,所有广告均符合我们的评价质量标准。%s 您会偶尔看到相关产品的广告。我们只宣传具有可靠评价的产品。 %s @@ -2312,26 +2266,26 @@ 此商品获得更多评价后,我们就能开始分析其评价的质量。 - 商品无货 + 商品无货 - 若您发现此商品已有货,请向我们反馈,以便我们核查评价。 - - 反馈此商品已有货 + 若您发现此商品已有货,请向我们反馈,以便我们核查评价。 - 报告商品有货 + 报告商品有货 - 正在核查评价质量 + 正在核查评价质量 - 正在核查评价质量 + 正在核查评价质量 + + 正在检查评价质量(%s) 这可能需要大约 60 秒。 - 感谢反馈! + 感谢反馈! - 我们会在 24 小时内提供此商品的评价分析信息,请记得回来查看。 + 我们会在 24 小时内提供此商品的评价分析信息,请记得回来查看。 无法核查这些评价 @@ -2372,17 +2326,17 @@ 详细了解 - 选择“试试看”,即代表您同意由 Mozilla 支持的 %1$s 的%2$s和%3$s。 + 选择“试试看”,即代表您同意由 Mozilla 支持的 %1$s 的%2$s和%3$s。 - 选择“试试看”,即代表您同意 %1$s 的: + 选择“试试看”,即代表您同意 %1$s 的: - 隐私政策 + 隐私政策 - 隐私政策 + 隐私政策 - 使用条款 + 使用条款 - 使用条款 + 使用条款 试试看 @@ -2419,6 +2373,9 @@ 竞争力 + + “%s” + 折叠 @@ -2471,4 +2428,207 @@ %s,标题 搜索已打开的标签页 完成时的对话框 + + %s,标题 + + + 链接 + + 链接可用 + + + + + + 要翻译此页面吗? + + 试用 %1$s 注重隐私的翻译功能 + + + 为保护隐私,翻译过程只会在本地进行。我们很快会支持更多语言并带来改进!%1$s + + 详细了解 + + 原始语言: + + 目标语言: + + 暂时不要 + + 完成 + + 翻译 + + 重试 + + 正在翻译 + + 正在翻译 + + + 翻译时遇到问题,请重试。 + + 无法加载语言包。请检查互联网连接,然后重试。 + + 抱歉,我们尚未支持%1$s。 + + 详细了解 + + + + 翻译设置 + + 始终询问是否翻译 + + 始终翻译%1$s + + 永不翻译%1$s + + 永不翻译此网站 + + 翻译设置 + + 关于 %1$s 提供的翻译 + + + + 翻译 + + 在翻译可用时询问是否翻译 + + 始终允许在流量节省模式开启时下载语言包 + + 翻译首选项 + + 自动翻译 + + 永不翻译这些网站 + + 下载语言包 + + + + 自动翻译 + + 请选择语言来管理“总是翻译”和“永不翻译”首选项。 + + + + 询问是否翻译(默认) + + %1$s 将询问是否翻译使用此语言的网站。 + + 总是翻译 + + + %1$s 将在加载页面时自动翻译此语言。 + + 永不翻译 + + %1$s 将永不翻译使用此语言的网站。 + + + + 永不翻译这些网站 + + 若要添加新网站,请先访问网站,然后在翻译菜单中选择“永不翻译此网站”。 + + 移除 %1$s + + 确定删除 %1$s 吗? + + 删除 + + 取消 + + + + 下载语言 + + 下载完整语言包以提高翻译速度,并可离线翻译。%1$s + + 了解更多 + + 可用语言 + + 必选 + + %1$s(%2$s) + + 下载语言包 + + 所有语言 + + 删除 + + 下载中 + + 下载 + + 已选中 + + + 确定删除%1$s(%2$s)吗? + + 若删除此语言,%1$s 将在翻译时下载并缓存语言包中部分内容。 + + 确定删除所有语言(%1$s)吗? + + 若删除所有语言,%1$s 将在翻译时下载并缓存语言包中部分内容。 + + 删除 + + 取消 + + + 要在流量节省模式开启时下载吗(%1$s)? + + 我们会下载并缓存语言包中部分内容,以保护翻译过程私密。 + + 始终允许在流量节省模式开启时下载 + + 下载 + + 下载并翻译 + + 取消 + + + + 调试工具 + + 向前导航 + + 标签页工具 + + 标签页数量 + + 活跃 + + 休眠 + + 隐私 + + 总数 + + 标签页创建工具 + + 要创建的标签页数量 + + 添加到活跃标签页 + + 添加到休眠标签页 + + 添加到隐私标签页 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d03914c378f4..1a184dfc72ad 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -71,11 +71,6 @@ 在此裝置不留下任何痕跡 - - %1$s 會在您關閉所有隱私瀏覽視窗後,清除您的 Cookie、瀏覽紀錄、網站資料。%2$s 在頁面中搜尋 + + 翻譯頁面 儲存至收藏集 @@ -336,14 +333,8 @@ 現在不要 - - 將 Firefox 設為主力瀏覽器 我們希望確保您上網安全 - - Firefox 將人們看得比利潤更重要,並且透過封鎖跨網站追蹤器等機制來捍衛您的隱私。\n\n可到我們的隱私權公告了解更多資訊。 這套由非營利組織打造的瀏覽器,可幫助防止企業在網路上偷偷追蹤您。\n\n到我們的隱私權公告了解更多資訊。 現在不要 - 在手機與筆電間快速切換 - 在不同裝置間切換時保持加密 - - 同步您其他裝置上的分頁與密碼,從中斷的地方繼續上網。 登入並同步資料後就更安全了,Firefox 會加密您的密碼、書籤等資料再同步。 @@ -366,15 +353,9 @@ 登入 現在不要 - - 透過通知,可幫助您使用 Firefox 做到更多事 透過通知功能,讓您使用 Firefox 更安全 - - 在不同裝置間發送分頁標籤、管理下載項目並獲得能完整發揮 Firefox 威力的使用秘訣。 在您的不同裝置間,安全地傳送分頁,並且探索 Firefox 當中其他保護隱私權的相關功能。 @@ -417,8 +398,6 @@ 選擇一套 - 管理搜尋捷徑 - 管理其他搜尋引擎 編輯搜尋選單中要出現的搜尋引擎 @@ -432,8 +411,6 @@ 搜尋引擎 來自其他搜尋引擎的建議 - - 網址列 網址列偏好設定 @@ -556,14 +533,10 @@ 然而也可能是有攻擊者正嘗試攔截您的網路連線。若您決定繼續開啟網站,就不該輸入任何敏感資訊。若繼續,將暫時針對此網站關閉純 HTTPS 模式。 輔助功能 - - 自訂 Firefox 帳號伺服器 自訂 Mozilla 帳號伺服器 自訂同步伺服器 - - 已更改 Firefox 帳號 / 同步伺服器設定。將結束應用程式讓變更生效… 已更改 Mozilla 帳號 / 同步伺服器設定。將結束應用程式讓變更生效… @@ -581,8 +554,6 @@ 登入後即可同步分頁、書籤、密碼與其他資料。 - Firefox 帳號 - Mozilla 帳號 重新連線,以恢復同步 @@ -595,8 +566,6 @@ 透過 USB 進行遠端除錯 - - 顯示搜尋引擎 顯示搜尋建議 @@ -729,12 +698,6 @@ 探索更多附加元件 - - - 不支援的附加元件 - - 已經安裝的附加元件 - 已暫時停用附加元件 @@ -1389,6 +1352,11 @@ 關閉隱私分頁 + + + 要關閉隱私分頁嗎? + 點擊或滑掉此分頁,即可關閉隱私分頁。 + 行銷活動 @@ -1633,6 +1601,8 @@ 所有 Cookie(會造成網站不正常) 隔離跨網站 Cookie + + 告訴網站不要銷售或分享我的資料 追蹤用內容 @@ -1971,28 +1941,18 @@ 新增搜尋引擎 編輯搜尋引擎 - - 新增 - - 儲存 編輯 刪除 - - 其他 名稱 - - 名稱 搜尋引擎名稱 搜尋字串 - 要使用的搜尋字串 - 用來搜尋的網址 用「%s」取代查詢關鍵字。例如:\nhttps://www.google.com/search?q=%s @@ -2221,8 +2181,6 @@ - 商品評論檢查器 - 商品評論檢查器 可靠的評論 @@ -2235,7 +2193,9 @@ 調整後評分 - 已移除不可靠的評論 + 已移除不可靠的評論 + + 根據可靠評論調整 近期評論的重點資訊 @@ -2246,14 +2206,10 @@ 評分。]]> 評論可靠。我們相信此商品的評論內容很可能是來自實際客戶所留下真實而中立的評論。 - - 我們認為評論可靠。 我們相信此商品評論混和了可靠與不可靠的評論。 評論不可靠。我們相信此商品的評論內容很可能是由虛假或偏頗的評論者所留下。 - - 我們認為評論不可靠。 調整後評分。]]> @@ -2269,8 +2225,6 @@ 在商品評論檢查器中顯示廣告 - 您會偶而看到相關商品的廣告,所有廣告都必須符合我們的審核評論品質標準。%s - 您會偶爾看到相關產品的廣告。我們只會為評論可靠的產品進行宣傳。 %s 了解更多 @@ -2293,23 +2247,23 @@ 當此商品有足夠的評論後,即可檢查其評論品質。 - 商品已下架 + 商品已下架 - 若您發現此產品又上架了,請回報給我們,我們將盡快檢查評論內容。 - - 回報此商品已重新上架 + 若您發現此產品又上架了,請回報給我們,我們將盡快檢查評論內容。 - 回報產品已有庫存 + 回報產品已有庫存 - 正在檢查評論品質 + 正在檢查評論品質 - 正在檢查評論品質 + 正在檢查評論品質 + + 正在檢查評論品質(%s) 可能需要 60 秒左右的時間。 - 感謝您回報! + 感謝您回報! - 我們將在 24 小時內提供更新過的評論分析資訊,請稍候再回來。 + 我們將在 24 小時內提供更新過的評論分析資訊,請稍候再回來。 我們無法檢查這些評論 @@ -2347,17 +2301,17 @@ 了解更多 - 選擇「好,試用看看」,代表您同意 %1$s by Mozilla 的 %2$s 與 %3$s 。 + 選擇「好,試用看看」,代表您同意 %1$s by Mozilla 的 %2$s 與 %3$s 。 - 選擇「好,試試看」,代表您同意 %1$s: + 選擇「好,試試看」,代表您同意 %1$s: - 隱私權保護政策 + 隱私權保護政策 - 隱私權保護政策 + 隱私權保護政策 - 使用條款 + 使用條款 - 使用條款 + 使用條款 好,試用看看 @@ -2393,6 +2347,9 @@ 商品競爭力 + + 「%s」 + 摺疊 @@ -2445,4 +2402,206 @@ 標題 %s 搜尋已開啟的標籤頁 完成時的對話方塊 + + 標題 %s + + + 鏈結 + + 可用鏈結 + + + + + + 要翻譯此頁面嗎? + + 在 %1$s 試用有隱私的翻譯功能 + + 為了保護您的隱私,要翻譯的內容不會離開您的裝置。即將支援更多新語言並改善功能!%1$s + + 更多資訊 + + 原始語言: + + 翻譯語言: + + 現在不要 + + 完成 + + 翻譯 + + 重試 + + 翻譯中 + + 翻譯中 + + + 翻譯時發生問題,請再試一次。 + + 無法載入翻譯語言,請確認您的網際網路連線是否正常後再試一次。 + + 很抱歉,我們還不支援%1$s翻譯。 + + 更多資訊 + + + + 翻譯選項 + + 總是提供翻譯 + + 總是翻譯 %1$s + + 永不翻譯 %1$s + + 永不翻譯此網站 + + 翻譯設定 + + 關於 %1$s 的翻譯功能 + + + + 翻譯 + + 可能翻譯時提供翻譯功能 + + 於資料節省模式下也總是下載翻譯語言檔 + + 翻譯偏好設定 + + 自動翻譯 + + 永不翻譯下列網站 + + 下載語言 + + + + 自動翻譯 + + 請選擇一種語言,來管理該語言的「總是翻譯」與「永不翻譯」偏好設定。 + + + + 提供翻譯(預設) + + %1$s 將提供此語言的網站翻譯內容 + + 總是翻譯 + + + %1$s 將在載入此語言網站時,自動進行翻譯 + + 永不翻譯 + + %1$s 不會提供此語言的翻譯功能 + + + + 永不翻譯下列網站 + + 若要新增網站:請開啟該網站,並於翻譯選單選擇「永不翻譯此網站」。 + + 移除 %1$s + + 要刪除 %1$s 嗎? + + 刪除 + + 取消 + + + + 下載語言 + + 下載完整的語言檔,即可更快完成翻譯,且不需要網路連線即可翻譯。%1$s + + 更多資訊 + + 可用語言 + + 必填 + + %1$s(%2$s) + + 下載語言 + + 所有語言 + + 刪除 + + 進行中 + + 下載 + + 已選擇 + + + 要刪除 %1$s(%2$s)嗎? + + 若您刪除此語言,%1$s 將在翻譯時下載部分語言檔到您的快取空間。 + + 要刪除所有語言(%1$s)嗎? + + 若您刪除所有語言,%1$s 將在翻譯時下載部分語言檔到您的快取空間。 + + 刪除 + + 取消 + + + 裝置處於資料節省模式時,也下載資料(%1$s)嗎? + + 我們會下載部分語言檔到您的快取空間中,來確保翻譯內容能於本機內翻譯。 + + 於資料節省模式下也總是下載資料 + + 下載 + + 下載並翻譯 + + 取消 + + + + 除錯工具 + + 瀏覽上一頁 + + 分頁工具 + + 分頁數量 + + 使用中 + + 未使用 + + 隱私 + + 共計 + + 分頁產生工具 + + 要產生的分頁數量 + + 新增至使用中的分頁 + + 新增至閒置分頁 + + 新增至隱私瀏覽分頁 diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index f5f33c5a65ec..f1673c28608f 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -38,6 +38,7 @@ pref_key_delete_browsing_data_on_quit_categories pref_key_last_known_mode_private pref_key_addons + pref_key_install_local_addon pref_key_override_amo_user pref_key_override_amo_collection pref_key_enable_gecko_logs @@ -77,6 +78,7 @@ pref_key_home_blocklist pref_key_hidden_engines_restored pref_key_fxsuggest_enabled + pref_key_enable_debug_drawer pref_key_telemetry @@ -137,6 +139,10 @@ pref_key_toolbar_top pref_key_toolbar_bottom + + pref_key_toolbar_use_redesign + pref_key_toolbar_use_redesign_incomplete + pref_key_privacy_pop_window @@ -212,6 +218,7 @@ pref_key_open_links_in_apps_never pref_key_external_download_manager pref_key_allow_screenshots_in_private_mode + pref_key_privacy_enable_global_privacy_control pref_key_adjust_campaign pref_key_adjust_network @@ -275,6 +282,8 @@ pref_key_should_show_total_cookie_protection_popup pref_key_should_show_erase_action_popup + + pref_key_should_enable_felt_privacy pref_key_should_show_cookie_banners_action_popup @@ -300,6 +309,8 @@ pref_key_show_collections_home + pref_key_num_font_list_sent + pref_key_growth_user_activated_sent pref_key_growth_early_browse_count diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index ed3435575713..5ea6dd9baca4 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -70,6 +70,12 @@ Enable Firefox Translations Enable Firefox Suggest + + Enable Toolbar Redesign incomplete portions + + Enable Felt Privacy + + Enable Debug Drawer Make inactive @@ -141,5 +147,4 @@ In progress Translating in Progress - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5f083f1bdef4..2586adba11f9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -610,6 +610,8 @@ Add-ons + + Install add-on from file Notifications @@ -1542,6 +1544,8 @@ All cookies (will cause websites to break) Isolate cross-site cookies + + Tell websites not to share & sell data Tracking content @@ -2116,7 +2120,9 @@ Adjusted rating - Unreliable reviews removed + Unreliable reviews removed + + Based on reliable reviews Highlights from recent reviews @@ -2162,8 +2168,6 @@ Ad by %s - Review checker is powered by %s. - Review checker is powered by %s %s by Mozilla @@ -2176,23 +2180,25 @@ When this product has more reviews, we’ll be able to check their quality. - Product is not available + Product is not available - If you see this product is back in stock, report it and we’ll work on checking the reviews. + If you see this product is back in stock, report it and we’ll work on checking the reviews. Report this product is back in stock - Report product is in stock + Report product is in stock - Checking review quality + Checking review quality - Checking review quality + Checking review quality + + Checking review quality (%s) This could take about 60 seconds. - Thanks for reporting! + Thanks for reporting! - We should have info about this product’s reviews within 24 hours. Please check back. + We should have info about this product’s reviews within 24 hours. Please check back. We can’t check these reviews @@ -2223,6 +2229,8 @@ Try our trusted guide to product reviews See how reliable product reviews are on %1$s before you buy. Review checker, an experimental feature from %2$s, is built right into the browser. It works on %3$s and %4$s, too. + + See how reliable product reviews are on %1$s before you buy. Review Checker, an experimental feature from %2$s, is built right into the browser. Using the power of %1$s by Mozilla, we help you avoid biased and inauthentic reviews. Our AI model is always improving to protect you as you shop. %2$s @@ -2273,6 +2281,8 @@ Packaging and appearance Competitiveness + + “%s” @@ -2325,4 +2335,68 @@ Cancel Search opened tabs Completion dialog box + + %s, Heading + + + + + + Automatic translation + + Select a language to manage ”always translate“ and ”never translate“ preferences. + + + + Offer to translate (default) + + %1$s will offer to translate sites in this language. + + Always translate + + %1$s will translate this language automatically when the page loads. + + Never translate + + %1$s will never offer to translate sites in this language. + + + + Never translate these sites + + To add a new site: Visit it and select “Never translate this site” from the translation menu. + + Remove %1$s + + Delete %1$s? + + Delete + + Cancel + + + + Download Languages + + Download complete languages for faster translations and to translate offline. %1$s + + Learn more + + Available languages + + required + + Download Languages + + All languages + + Delete + + In progress + + Download + + Selected diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 42a61d422c3e..46c1feb42090 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -143,6 +143,12 @@ app:iconSpaceReserved="false" android:title="@string/preferences_addons" /> + + + + + + (relaxed = true) + val useCases = mockk() + val selectOrAddTab = mockk() + every { selectOrAddTab.invoke(any(), any(), any(), any(), any()) } returns "some-tab-id" + every { useCases.selectOrAddTab } returns selectOrAddTab + every { testContext.components.useCases.tabsUseCases } returns useCases + // We create the `binding` instance and bind the UI here because `onCreateView()` checks a late init variable + // and we cannot easily mock it to skip the check. + fragment.setBindingAndBindUI( + FragmentInstalledAddOnDetailsBinding.inflate( + LayoutInflater.from(testContext), + mockk(relaxed = true), + false, + ), + ) + val navController = mockk(relaxed = true) + Navigation.setViewNavController(fragment.binding.root, navController) + + // Click the report button. + fragment.binding.reportAddOn.performClick() + + verify { + selectOrAddTab.invoke( + url = "https://addons.mozilla.org/android/feedback/addon/some-addon-id/", + private = false, + ignoreFragment = true, + ) + } + verify { + navController.navigate( + InstalledAddonDetailsFragmentDirections.actionGlobalBrowser(null), + ) + } + } + + @Test + fun `GIVEN an add-on and private browsing mode is used WHEN clicking the report button THEN a new private tab is open`() { + val addon = mockAddon() + every { fragment.addon } returns addon + val homeActivity = mockk(relaxed = true) + every { homeActivity.browsingModeManager.mode.isPrivate } returns true + every { fragment.activity } returns homeActivity + val useCases = mockk() + val selectOrAddTab = mockk() + every { selectOrAddTab.invoke(any(), any(), any(), any(), any()) } returns "some-tab-id" + every { useCases.selectOrAddTab } returns selectOrAddTab + every { testContext.components.useCases.tabsUseCases } returns useCases + // We create the `binding` instance and bind the UI here because `onCreateView()` checks a late init variable + // and we cannot easily mock it to skip the check. + fragment.setBindingAndBindUI( + FragmentInstalledAddOnDetailsBinding.inflate( + LayoutInflater.from(testContext), + mockk(relaxed = true), + false, + ), + ) + val navController = mockk(relaxed = true) + Navigation.setViewNavController(fragment.binding.root, navController) + + // Click the report button. + fragment.binding.reportAddOn.performClick() + + verify { + selectOrAddTab.invoke( + url = "https://addons.mozilla.org/android/feedback/addon/some-addon-id/", + private = true, + ignoreFragment = true, + ) + } + verify { + navController.navigate( + InstalledAddonDetailsFragmentDirections.actionGlobalBrowser(null), + ) + } + } + + private fun mockAddon(): Addon { + val addon: Addon = mockk() + every { addon.id } returns "some-addon-id" + every { addon.isEnabled() } returns true + every { addon.isDisabledAsBlocklisted() } returns false + every { addon.isDisabledAsNotCorrectlySigned() } returns false + every { addon.isDisabledAsIncompatible() } returns false + every { addon.installedState } returns null + every { addon.isAllowedInPrivateBrowsing() } returns false + return addon + } } diff --git a/app/src/test/java/org/mozilla/fenix/components/UrlRequestInterceptorTest.kt b/app/src/test/java/org/mozilla/fenix/components/UrlRequestInterceptorTest.kt new file mode 100644 index 000000000000..058c47e24c9e --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/components/UrlRequestInterceptorTest.kt @@ -0,0 +1,235 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components + +import io.mockk.mockk +import mozilla.components.concept.engine.EngineSession +import mozilla.components.concept.engine.EngineSession.LoadUrlFlags +import mozilla.components.concept.engine.EngineSession.LoadUrlFlags.Companion.ALLOW_ADDITIONAL_HEADERS +import mozilla.components.concept.engine.EngineSession.LoadUrlFlags.Companion.LOAD_FLAGS_BYPASS_LOAD_URI_DELEGATE +import mozilla.components.concept.engine.request.RequestInterceptor +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner + +@RunWith(FenixRobolectricTestRunner::class) +class UrlRequestInterceptorTest { + + private lateinit var engineSession: EngineSession + + @Before + fun setup() { + engineSession = mockk(relaxed = true) + } + + @Test + fun `GIVEN device is above threshold WHEN get additional headers is called THEN return the correct map of additional headers`() { + val isDeviceRamAboveThreshold = true + val urlRequestInterceptor = getUrlRequestInterceptor( + isDeviceRamAboveThreshold = isDeviceRamAboveThreshold, + ) + + assertEquals( + mapOf("X-Search-Subdivision" to "1"), + urlRequestInterceptor.getAdditionalHeaders(isDeviceRamAboveThreshold), + ) + } + + @Test + fun `GIVEN device is not above threshold WHEN get additional headers is called THEN return the correct map of additional headers`() { + val isDeviceRamAboveThreshold = false + val urlRequestInterceptor = getUrlRequestInterceptor( + isDeviceRamAboveThreshold = isDeviceRamAboveThreshold, + ) + + assertEquals( + mapOf("X-Search-Subdivision" to "0"), + urlRequestInterceptor.getAdditionalHeaders(isDeviceRamAboveThreshold), + ) + } + + @Test + fun `WHEN should intercept request is called THEN return the correct boolean value`() { + val urlRequestInterceptor = getUrlRequestInterceptor() + + assertFalse( + urlRequestInterceptor.shouldInterceptRequest( + uri = "https://getpocket.com", + isSubframeRequest = false, + ), + ) + assertFalse( + urlRequestInterceptor.shouldInterceptRequest( + uri = "https://www.google.com", + isSubframeRequest = false, + ), + ) + assertTrue( + urlRequestInterceptor.shouldInterceptRequest( + uri = "https://www.google.com/search?q=blue", + isSubframeRequest = false, + ), + ) + assertTrue( + urlRequestInterceptor.shouldInterceptRequest( + uri = "https://www.google.ca/search?q=red", + isSubframeRequest = false, + ), + ) + assertTrue( + urlRequestInterceptor.shouldInterceptRequest( + uri = "https://www.google.co.jp/search?q=red", + isSubframeRequest = false, + ), + ) + assertFalse( + urlRequestInterceptor.shouldInterceptRequest( + uri = "https://www.google.com/search?q=blue", + isSubframeRequest = true, + ), + ) + assertFalse( + urlRequestInterceptor.shouldInterceptRequest( + uri = "https://www.google.com/recaptcha", + isSubframeRequest = true, + ), + ) + } + + @Test + fun `WHEN a Pocket request is loaded THEN request is not intercepted`() { + val uri = "https://getpocket.com" + val response = getUrlRequestInterceptor().onLoadRequest( + uri = uri, + ) + + assertNull(response) + } + + @Test + fun `WHEN a Google request is loaded THEN request is not intercepted`() { + val uri = "https://www.google.com" + val response = getUrlRequestInterceptor().onLoadRequest( + uri = uri, + ) + + assertNull(response) + } + + @Test + fun `WHEN a Google search request is loaded THEN request is intercepted`() { + val uri = "https://www.google.com/search?q=blue" + + assertEquals( + RequestInterceptor.InterceptionResponse.Url( + url = uri, + flags = LoadUrlFlags.select( + LOAD_FLAGS_BYPASS_LOAD_URI_DELEGATE, + ALLOW_ADDITIONAL_HEADERS, + ), + additionalHeaders = mapOf( + "X-Search-Subdivision" to "1", + ), + ), + getUrlRequestInterceptor(isDeviceRamAboveThreshold = true).onLoadRequest( + uri = uri, + ), + ) + + assertEquals( + RequestInterceptor.InterceptionResponse.Url( + url = uri, + flags = LoadUrlFlags.select( + LOAD_FLAGS_BYPASS_LOAD_URI_DELEGATE, + ALLOW_ADDITIONAL_HEADERS, + ), + additionalHeaders = mapOf( + "X-Search-Subdivision" to "0", + ), + ), + getUrlRequestInterceptor(isDeviceRamAboveThreshold = false).onLoadRequest( + uri = uri, + ), + ) + } + + @Test + fun `WHEN a Google search request with a ca TLD request is loaded THEN request is intercepted`() { + val uri = "https://www.google.ca/search?q=red" + + assertEquals( + RequestInterceptor.InterceptionResponse.Url( + url = uri, + flags = LoadUrlFlags.select( + LOAD_FLAGS_BYPASS_LOAD_URI_DELEGATE, + ALLOW_ADDITIONAL_HEADERS, + ), + additionalHeaders = mapOf( + "X-Search-Subdivision" to "1", + ), + ), + getUrlRequestInterceptor(isDeviceRamAboveThreshold = true).onLoadRequest( + uri = uri, + ), + ) + + assertEquals( + RequestInterceptor.InterceptionResponse.Url( + url = uri, + flags = LoadUrlFlags.select( + LOAD_FLAGS_BYPASS_LOAD_URI_DELEGATE, + ALLOW_ADDITIONAL_HEADERS, + ), + additionalHeaders = mapOf( + "X-Search-Subdivision" to "0", + ), + ), + getUrlRequestInterceptor(isDeviceRamAboveThreshold = false).onLoadRequest( + uri = uri, + ), + ) + } + + @Test + fun `WHEN a Google subframe request is loaded THEN request is not intercepted`() { + val uri = "https://www.google.com/search?q=blue" + + assertNull( + getUrlRequestInterceptor(isDeviceRamAboveThreshold = true).onLoadRequest( + uri = uri, + isSubframeRequest = true, + ), + ) + } + + private fun getUrlRequestInterceptor(isDeviceRamAboveThreshold: Boolean = false) = + UrlRequestInterceptor( + isDeviceRamAboveThreshold = isDeviceRamAboveThreshold, + ) + + private fun UrlRequestInterceptor.onLoadRequest( + uri: String, + lastUri: String? = null, + hasUserGesture: Boolean = false, + isSameDomain: Boolean = false, + isRedirect: Boolean = false, + isDirectNavigation: Boolean = false, + isSubframeRequest: Boolean = false, + ) = this.onLoadRequest( + engineSession = engineSession, + uri = uri, + lastUri = lastUri, + hasUserGesture = hasUserGesture, + isSameDomain = isSameDomain, + isRedirect = isRedirect, + isDirectNavigation = isDirectNavigation, + isSubframeRequest = isSubframeRequest, + ) +} diff --git a/app/src/test/java/org/mozilla/fenix/components/appstate/ShoppingActionTest.kt b/app/src/test/java/org/mozilla/fenix/components/appstate/ShoppingActionTest.kt index 9ea044796993..30f9e708f3d4 100644 --- a/app/src/test/java/org/mozilla/fenix/components/appstate/ShoppingActionTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/appstate/ShoppingActionTest.kt @@ -203,4 +203,48 @@ class ShoppingActionTest { assertEquals(expected, store.state.shoppingState) } + + @Test + fun `WHEN product recommendation impression is recorded THEN state should reflect that`() { + val store = AppStore( + initialState = AppState( + shoppingState = ShoppingState( + recordedProductRecommendationImpressions = setOf( + ShoppingState.ProductRecommendationImpressionKey( + productUrl = "pdp", + tabId = "1", + aid = "aid", + ), + ), + ), + ), + ) + + store.dispatch( + AppAction.ShoppingAction.ProductRecommendationImpression( + key = ShoppingState.ProductRecommendationImpressionKey( + productUrl = "pdp2", + tabId = "2", + aid = "aid2", + ), + ), + ).joinBlocking() + + val expected = ShoppingState( + recordedProductRecommendationImpressions = setOf( + ShoppingState.ProductRecommendationImpressionKey( + productUrl = "pdp", + tabId = "1", + aid = "aid", + ), + ShoppingState.ProductRecommendationImpressionKey( + productUrl = "pdp2", + tabId = "2", + aid = "aid2", + ), + ), + ) + + assertEquals(expected, store.state.shoppingState) + } } diff --git a/app/src/test/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCaseTest.kt b/app/src/test/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCaseTest.kt index 2f0456454704..e611dc8d901f 100644 --- a/app/src/test/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCaseTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCaseTest.kt @@ -57,6 +57,23 @@ class BookmarksUseCaseTest { coVerify { bookmarksStorage.addItem(BookmarkRoot.Mobile.id, "https://mozilla.org", "Mozilla", null) } } + @Test + fun `WHEN adding bookmark THEN new item is stored in folder`() = runTest { + val bookmarksStorage = mockk(relaxed = true) + val historyStorage = mockk(relaxed = true) + val bookmarkNode = mockk() + val useCase = BookmarksUseCase(bookmarksStorage, historyStorage) + + every { bookmarkNode.url }.answers { "https://firefox.com" } + coEvery { bookmarksStorage.getBookmarksWithUrl(any()) }.coAnswers { listOf(bookmarkNode) } + + val result = useCase.addBookmark("https://mozilla.org", "Mozilla", parentGuid = "parentGuid") + + assertTrue(result) + + coVerify { bookmarksStorage.addItem("parentGuid", "https://mozilla.org", "Mozilla", null) } + } + @Test fun `WHEN recently saved bookmarks exist THEN retrieve the list from storage`() = runTest { val bookmarksStorage = mockk(relaxed = true) diff --git a/app/src/test/java/org/mozilla/fenix/debugsettings/DefaultDebugSettingsRepositoryTest.kt b/app/src/test/java/org/mozilla/fenix/debugsettings/DefaultDebugSettingsRepositoryTest.kt new file mode 100644 index 000000000000..8bdd86ba7eff --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/debugsettings/DefaultDebugSettingsRepositoryTest.kt @@ -0,0 +1,62 @@ +package org.mozilla.fenix.debugsettings + +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.preferencesDataStore +import androidx.test.ext.junit.runners.AndroidJUnit4 +import kotlinx.coroutines.flow.take +import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.test.runTest +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.debugsettings.data.DefaultDebugSettingsRepository + +private val Context.testDataStore: DataStore by preferencesDataStore(name = "DefaultDebugSettingsRepositoryTest") + +@RunWith(AndroidJUnit4::class) +class DefaultDebugSettingsRepositoryTest { + + @Test + fun `GIVEN the debug drawer is disabled WHEN the flag is enabled THEN the store should emit true`() = runTest { + val dataStore = testContext.testDataStore + val defaultDebugSettingsRepository = DefaultDebugSettingsRepository( + context = testContext, + dataStore = dataStore, + writeScope = this, + ) + val expected = listOf(false, false, true) // First emit is from initialization + val expectedEmitCount = expected.size + + defaultDebugSettingsRepository.setDebugDrawerEnabled(false) + + defaultDebugSettingsRepository.setDebugDrawerEnabled(true) + + assertEquals(expected, defaultDebugSettingsRepository.debugDrawerEnabled.take(expectedEmitCount).toList()) + + dataStore.edit { it.clear() } + } + + @Test + fun `GIVEN the debug drawer is enabled WHEN the flag is disabled THEN the store should emit false`() = runTest { + val dataStore = testContext.testDataStore + val defaultDebugSettingsRepository = DefaultDebugSettingsRepository( + context = testContext, + dataStore = dataStore, + writeScope = this, + ) + val expected = listOf(false, true, false) // First emit is from initialization + val expectedEmitCount = expected.size + + defaultDebugSettingsRepository.setDebugDrawerEnabled(true) + + defaultDebugSettingsRepository.setDebugDrawerEnabled(false) + + assertEquals(expected, defaultDebugSettingsRepository.debugDrawerEnabled.take(expectedEmitCount).toList()) + + dataStore.edit { it.clear() } + } +} diff --git a/app/src/test/java/org/mozilla/fenix/extension/WebExtensionPromptFeatureTest.kt b/app/src/test/java/org/mozilla/fenix/extension/WebExtensionPromptFeatureTest.kt index 3e8d16f0e372..cc23b1227524 100644 --- a/app/src/test/java/org/mozilla/fenix/extension/WebExtensionPromptFeatureTest.kt +++ b/app/src/test/java/org/mozilla/fenix/extension/WebExtensionPromptFeatureTest.kt @@ -307,4 +307,22 @@ class WebExtensionPromptFeatureTest { } verify(exactly = 1) { onConfirm(true) } } + + @Test + fun `WHEN calling handleInstallationFailedRequest with UnsupportedAddonType error THEN showDialog with the correct message`() { + val expectedTitle = "" + val extensionName = "extensionName" + val exception = WebExtensionInstallException.UnsupportedAddonType( + extensionName = extensionName, + throwable = Exception(), + ) + val expectedMessage = + testContext.getString(R.string.mozac_feature_addons_failed_to_install, extensionName) + + webExtensionPromptFeature.handleInstallationFailedRequest( + exception = exception, + ) + + verify { webExtensionPromptFeature.showDialog(expectedTitle, expectedMessage) } + } } diff --git a/app/src/test/java/org/mozilla/fenix/onboarding/view/JunoOnboardingMapperTest.kt b/app/src/test/java/org/mozilla/fenix/onboarding/view/OnboardingMapperTest.kt similarity index 99% rename from app/src/test/java/org/mozilla/fenix/onboarding/view/JunoOnboardingMapperTest.kt rename to app/src/test/java/org/mozilla/fenix/onboarding/view/OnboardingMapperTest.kt index a48b4edd39a0..cd9f92a48547 100644 --- a/app/src/test/java/org/mozilla/fenix/onboarding/view/JunoOnboardingMapperTest.kt +++ b/app/src/test/java/org/mozilla/fenix/onboarding/view/OnboardingMapperTest.kt @@ -10,7 +10,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.compose.LinkTextState import org.mozilla.fenix.settings.SupportUtils -class JunoOnboardingMapperTest { +class OnboardingMapperTest { @Test fun `GIVEN a default browser page WHEN mapToOnboardingPageState is called THEN creates the expected OnboardingPageState`() { diff --git a/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt b/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt index 487269666216..0cff849d0524 100644 --- a/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt @@ -48,11 +48,9 @@ import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.Core import org.mozilla.fenix.components.metrics.MetricsUtils -import org.mozilla.fenix.ext.application import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.search.SearchDialogFragmentDirections.Companion.actionGlobalAddonsManagementFragment import org.mozilla.fenix.search.SearchDialogFragmentDirections.Companion.actionGlobalSearchEngineFragment -import org.mozilla.fenix.search.awesomebar.AwesomeBarView.Companion.GOOGLE_SEARCH_ENGINE_NAME import org.mozilla.fenix.search.toolbar.SearchSelectorMenu import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.utils.Settings @@ -90,7 +88,6 @@ class SearchDialogControllerTest { ) every { store.state.tabId } returns "test-tab-id" every { store.state.searchEngineSource.searchEngine } returns searchEngine - every { searchEngine.name } returns "" every { searchEngine.type } returns SearchEngine.Type.BUNDLED every { navController.currentDestination } returns mockk { every { id } returns R.id.searchDialogFragment @@ -121,8 +118,6 @@ class SearchDialogControllerTest { from = BrowserDirection.FromSearchDialog, engine = searchEngine, forceSearch = false, - flags = EngineSession.LoadUrlFlags.none(), - additionalHeaders = null, ) } @@ -154,8 +149,6 @@ class SearchDialogControllerTest { from = BrowserDirection.FromSearchDialog, engine = searchEngine, forceSearch = true, - flags = EngineSession.LoadUrlFlags.none(), - additionalHeaders = null, ) } @@ -169,70 +162,6 @@ class SearchDialogControllerTest { assertEquals("false", snapshot.single().extra?.getValue("autocomplete")) } - @Test - fun `GIVEN Google search engine is selected and device ram is above threshold WHEN url is committed THEN perform search`() { - val searchTerm = "coffee" - assertNull(Events.enteredUrl.testGetValue()) - - every { searchEngine.name } returns GOOGLE_SEARCH_ENGINE_NAME - every { store.state.defaultEngine } returns searchEngine - every { activity.applicationContext.application.isDeviceRamAboveThreshold } returns true - - createController().handleUrlCommitted(searchTerm) - - browserStore.waitUntilIdle() - - verify { - activity.openToBrowserAndLoad( - searchTermOrURL = searchTerm, - newTab = false, - from = BrowserDirection.FromSearchDialog, - engine = searchEngine, - forceSearch = false, - flags = EngineSession.LoadUrlFlags.select(EngineSession.LoadUrlFlags.ALLOW_ADDITIONAL_HEADERS), - additionalHeaders = mapOf( - "X-Search-Subdivision" to "1", - ), - ) - } - - middleware.assertLastAction(AwesomeBarAction.EngagementFinished::class) { action -> - assertFalse(action.abandoned) - } - } - - @Test - fun `GIVEN Google search engine is selected and device ram is below threshold WHEN url is committed THEN perform search`() { - val searchTerm = "coffee" - assertNull(Events.enteredUrl.testGetValue()) - - every { searchEngine.name } returns GOOGLE_SEARCH_ENGINE_NAME - every { store.state.defaultEngine } returns searchEngine - every { activity.applicationContext.application.isDeviceRamAboveThreshold } returns false - - createController().handleUrlCommitted(searchTerm) - - browserStore.waitUntilIdle() - - verify { - activity.openToBrowserAndLoad( - searchTermOrURL = searchTerm, - newTab = false, - from = BrowserDirection.FromSearchDialog, - engine = searchEngine, - forceSearch = false, - flags = EngineSession.LoadUrlFlags.select(EngineSession.LoadUrlFlags.ALLOW_ADDITIONAL_HEADERS), - additionalHeaders = mapOf( - "X-Search-Subdivision" to "0", - ), - ) - } - - middleware.assertLastAction(AwesomeBarAction.EngagementFinished::class) { action -> - assertFalse(action.abandoned) - } - } - @Test fun handleBlankUrlCommitted() { val url = "" @@ -268,8 +197,6 @@ class SearchDialogControllerTest { from = BrowserDirection.FromSearchDialog, engine = searchEngine, forceSearch = true, - flags = EngineSession.LoadUrlFlags.none(), - additionalHeaders = null, ) } @@ -358,8 +285,6 @@ class SearchDialogControllerTest { newTab = false, from = BrowserDirection.FromSearchDialog, engine = searchEngine, - flags = EngineSession.LoadUrlFlags.none(), - additionalHeaders = null, ) } @@ -495,8 +420,6 @@ class SearchDialogControllerTest { from = BrowserDirection.FromSearchDialog, engine = searchEngine, forceSearch = true, - flags = EngineSession.LoadUrlFlags.none(), - additionalHeaders = null, ) } diff --git a/app/src/test/java/org/mozilla/fenix/settings/SettingsFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/settings/SettingsFragmentTest.kt index 425220b3f28c..9e8ad2f52a30 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/SettingsFragmentTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/SettingsFragmentTest.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.settings +import android.os.Build import androidx.core.app.NotificationManagerCompat import androidx.fragment.app.FragmentActivity import androidx.preference.Preference @@ -31,6 +32,7 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R import org.mozilla.fenix.ext.components @@ -57,6 +59,7 @@ class SettingsFragmentTest { every { testContext.components.core.engine.profiler } returns mockk(relaxed = true) every { testContext.components.core.client } returns client every { testContext.components.settings } returns mockk(relaxed = true) + every { testContext.components.addonManager } returns mockk(relaxed = true) every { testContext.components.analytics } returns mockk(relaxed = true) every { testContext.components.backgroundServices } returns mockk(relaxed = true) @@ -95,6 +98,57 @@ class SettingsFragmentTest { assertTrue(preferenceAmoCollectionOverride.isVisible) } + @Test + @org.robolectric.annotation.Config(sdk = [Build.VERSION_CODES.Q]) + fun `Install add-on from file pref is visible if debug menu active and feature is enabled`() = runTestOnMain { + val settingsFragment = SettingsFragment() + val activity = Robolectric.buildActivity(FragmentActivity::class.java).create().get() + + activity.supportFragmentManager.beginTransaction() + .add(settingsFragment, "test") + .commitNow() + + advanceUntilIdle() + + val preference = settingsFragment.findPreference( + settingsFragment.getPreferenceKey(R.string.pref_key_install_local_addon), + ) + + settingsFragment.setupInstallAddonFromFilePreference(mockk(relaxed = true)) + assertNotNull(preference) + assertFalse(preference!!.isVisible) + + val settings: Settings = mockk(relaxed = true) + + every { settings.showSecretDebugMenuThisSession } returns true + settingsFragment.setupInstallAddonFromFilePreference(settings) + assertTrue(preference.isVisible) + unmockkObject(Config) + } + + @Test + @org.robolectric.annotation.Config(sdk = [Build.VERSION_CODES.P]) + fun `Install add-on from file pref is invisible below Android 10`() = runTestOnMain { + val settingsFragment = SettingsFragment() + val activity = Robolectric.buildActivity(FragmentActivity::class.java).create().get() + + activity.supportFragmentManager.beginTransaction() + .add(settingsFragment, "test") + .commitNow() + + advanceUntilIdle() + + val preference = settingsFragment.findPreference( + settingsFragment.getPreferenceKey(R.string.pref_key_install_local_addon), + ) + + val settings: Settings = mockk(relaxed = true) + + every { settings.showSecretDebugMenuThisSession } returns true + settingsFragment.setupInstallAddonFromFilePreference(settings) + assertFalse(preference!!.isVisible) + } + @Test fun `Add-on collection override pref is visible if already configured and feature is enabled`() = runTestOnMain { val settingsFragment = SettingsFragment() diff --git a/app/src/test/java/org/mozilla/fenix/shopping/ProductAnalysisTestData.kt b/app/src/test/java/org/mozilla/fenix/shopping/ProductAnalysisTestData.kt index 17ecb7bd4d35..2d2b469680cc 100644 --- a/app/src/test/java/org/mozilla/fenix/shopping/ProductAnalysisTestData.kt +++ b/app/src/test/java/org/mozilla/fenix/shopping/ProductAnalysisTestData.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.shopping import mozilla.components.concept.engine.shopping.Highlight import mozilla.components.concept.engine.shopping.ProductAnalysis import org.mozilla.fenix.shopping.store.ReviewQualityCheckState +import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent.AnalysisStatus import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent.HighlightsInfo import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.RecommendedProductState @@ -44,11 +45,11 @@ object ProductAnalysisTestData { productUrl: String = "https://test.com", reviewGrade: ReviewQualityCheckState.Grade? = ReviewQualityCheckState.Grade.A, adjustedRating: Float? = 4.5f, - analysisStatus: AnalysisStatus = AnalysisStatus.UP_TO_DATE, + analysisStatus: AnalysisStatus = AnalysisStatus.UpToDate, highlightsInfo: HighlightsInfo? = null, recommendedProductState: RecommendedProductState = RecommendedProductState.Initial, - ): ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent = - ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent( + ): ProductReviewState.AnalysisPresent = + ProductReviewState.AnalysisPresent( productId = productId, productUrl = productUrl, reviewGrade = reviewGrade, @@ -57,4 +58,11 @@ object ProductAnalysisTestData { highlightsInfo = highlightsInfo, recommendedProductState = recommendedProductState, ) + + fun noAnalysisPresent( + progress: Float = -1f, + ): ProductReviewState.NoAnalysisPresent = + ProductReviewState.NoAnalysisPresent( + progress = ProductReviewState.Progress(progress), + ) } diff --git a/app/src/test/java/org/mozilla/fenix/shopping/fake/FakeReviewQualityCheckService.kt b/app/src/test/java/org/mozilla/fenix/shopping/fake/FakeReviewQualityCheckService.kt index 656cef19b8dd..e049f88fb1f9 100644 --- a/app/src/test/java/org/mozilla/fenix/shopping/fake/FakeReviewQualityCheckService.kt +++ b/app/src/test/java/org/mozilla/fenix/shopping/fake/FakeReviewQualityCheckService.kt @@ -7,15 +7,16 @@ package org.mozilla.fenix.shopping.fake import mozilla.components.concept.engine.shopping.ProductAnalysis import mozilla.components.concept.engine.shopping.ProductRecommendation import org.mozilla.fenix.shopping.middleware.AnalysisStatusDto +import org.mozilla.fenix.shopping.middleware.AnalysisStatusProgressDto +import org.mozilla.fenix.shopping.middleware.ReportBackInStockStatusDto import org.mozilla.fenix.shopping.middleware.ReviewQualityCheckService class FakeReviewQualityCheckService( private val productAnalysis: (Int) -> ProductAnalysis? = { null }, private val reanalysis: AnalysisStatusDto? = null, - private val status: AnalysisStatusDto? = null, + private val statusProgress: () -> AnalysisStatusProgressDto? = { null }, private val productRecommendation: () -> ProductRecommendation? = { null }, - private val recordClick: (String) -> Unit = {}, - private val recordImpression: (String) -> Unit = {}, + private val report: ReportBackInStockStatusDto? = null, ) : ReviewQualityCheckService { private var analysisCount = 0 @@ -28,17 +29,13 @@ class FakeReviewQualityCheckService( override suspend fun reanalyzeProduct(): AnalysisStatusDto? = reanalysis - override suspend fun analysisStatus(): AnalysisStatusDto? = status + override suspend fun analysisStatus(): AnalysisStatusProgressDto? { + return statusProgress.invoke() + } override suspend fun productRecommendation(shouldRecordAvailableTelemetry: Boolean): ProductRecommendation? { return productRecommendation.invoke() } - override suspend fun recordRecommendedProductClick(productAid: String) { - recordClick(productAid) - } - - override suspend fun recordRecommendedProductImpression(productAid: String) { - recordImpression(productAid) - } + override suspend fun reportBackInStock(): ReportBackInStockStatusDto? = report } diff --git a/app/src/test/java/org/mozilla/fenix/shopping/fake/FakeReviewQualityCheckTelemetryService.kt b/app/src/test/java/org/mozilla/fenix/shopping/fake/FakeReviewQualityCheckTelemetryService.kt new file mode 100644 index 000000000000..07a377f3bd80 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/shopping/fake/FakeReviewQualityCheckTelemetryService.kt @@ -0,0 +1,21 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.shopping.fake + +import org.mozilla.fenix.shopping.middleware.ReviewQualityCheckTelemetryService + +class FakeReviewQualityCheckTelemetryService( + private val recordClick: (String) -> Unit = {}, + private val recordImpression: (String) -> Unit = {}, +) : ReviewQualityCheckTelemetryService { + + override suspend fun recordRecommendedProductClick(productAid: String) { + return recordClick.invoke(productAid) + } + + override suspend fun recordRecommendedProductImpression(productAid: String) { + return recordImpression.invoke(productAid) + } +} diff --git a/app/src/test/java/org/mozilla/fenix/shopping/middleware/DefaultReviewQualityCheckServiceTest.kt b/app/src/test/java/org/mozilla/fenix/shopping/middleware/DefaultReviewQualityCheckServiceTest.kt index 56f74a5f487e..f774988291dd 100644 --- a/app/src/test/java/org/mozilla/fenix/shopping/middleware/DefaultReviewQualityCheckServiceTest.kt +++ b/app/src/test/java/org/mozilla/fenix/shopping/middleware/DefaultReviewQualityCheckServiceTest.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.shopping.middleware import io.mockk.every import io.mockk.mockk +import io.mockk.verify import kotlinx.coroutines.test.runTest import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.createTab @@ -239,4 +240,74 @@ class DefaultReviewQualityCheckServiceTest { assertNull(actual) } + + @Test + fun `GIVEN product recommendations is called WHEN onResult is invoked with the result THEN recommendations returns the same result without re-fetching again`() = + runTest { + val engineSession = mockk() + val expected = ProductRecommendationTestData.productRecommendation() + val productRecommendations = listOf(expected) + + every { + engineSession.requestProductRecommendations(any(), any(), any()) + }.answers { + secondArg<(List) -> Unit>().invoke(productRecommendations) + } + + val tab = createTab( + url = "https://www.shopping.org/product", + id = "test-tab", + engineSession = engineSession, + ) + val browserState = BrowserState( + tabs = listOf(tab), + selectedTabId = tab.id, + ) + + val tested = DefaultReviewQualityCheckService(BrowserStore(browserState)) + + tested.productRecommendation(false) + tested.productRecommendation(false) + val actual = tested.productRecommendation(false) + + assertEquals(expected, actual) + + verify(exactly = 1) { + engineSession.requestProductRecommendations(any(), any(), any()) + } + } + + @Test + fun `GIVEN product recommendations is called WHEN onResult is invoked with the empty result THEN recommendations fetches every time`() = + runTest { + val engineSession = mockk() + + every { + engineSession.requestProductRecommendations(any(), any(), any()) + }.answers { + secondArg<(List) -> Unit>().invoke(emptyList()) + } + + val tab = createTab( + url = "https://www.shopping.org/product", + id = "test-tab", + engineSession = engineSession, + ) + val browserState = BrowserState( + tabs = listOf(tab), + selectedTabId = tab.id, + ) + + val tested = DefaultReviewQualityCheckService(BrowserStore(browserState)) + + tested.productRecommendation(false) + tested.productRecommendation(false) + val actual = tested.productRecommendation(false) + + assertNull(actual) + + verify(exactly = 3) { + engineSession.requestProductRecommendations(any(), any(), any()) + } + } } diff --git a/app/src/test/java/org/mozilla/fenix/shopping/middleware/DefaultReviewQualityCheckVendorsServiceTest.kt b/app/src/test/java/org/mozilla/fenix/shopping/middleware/DefaultReviewQualityCheckVendorsServiceTest.kt index 362f242d9d8e..b7a045a30516 100644 --- a/app/src/test/java/org/mozilla/fenix/shopping/middleware/DefaultReviewQualityCheckVendorsServiceTest.kt +++ b/app/src/test/java/org/mozilla/fenix/shopping/middleware/DefaultReviewQualityCheckVendorsServiceTest.kt @@ -15,7 +15,7 @@ import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.ProductVendor class DefaultReviewQualityCheckVendorsServiceTest { @Test - fun `WHEN selected tab is an amazon page THEN amazon is first in product vendors list`() = + fun `WHEN selected tab is an amazon_com page THEN amazon is first in product vendors list`() = runTest { val tab = createTab( url = "https://www.amazon.com/product", @@ -135,6 +135,70 @@ class DefaultReviewQualityCheckVendorsServiceTest { ProductVendor.WALMART, ) + assertEquals(expected, actual) + } + + @Test + fun `WHEN selected tab is an amazon_de page THEN amazon is first in product vendors list`() = + runTest { + val tab = createTab( + url = "https://www.amazon.de/product", + id = "test-tab", + ) + val browserState = BrowserState( + tabs = listOf(tab), + selectedTabId = tab.id, + ) + + val tested = DefaultReviewQualityCheckVendorsService(BrowserStore(browserState)) + + val actual = tested.productVendors() + val expected = listOf(ProductVendor.AMAZON) + + assertEquals(expected, actual) + } + + @Test + fun `WHEN selected tab is an amazon_fr page THEN amazon is first in product vendors list`() = + runTest { + val tab = createTab( + url = "https://www.amazon.fr/product", + id = "test-tab", + ) + val browserState = BrowserState( + tabs = listOf(tab), + selectedTabId = tab.id, + ) + + val tested = DefaultReviewQualityCheckVendorsService(BrowserStore(browserState)) + + val actual = tested.productVendors() + val expected = listOf(ProductVendor.AMAZON) + + assertEquals(expected, actual) + } + + @Test + fun `WHEN selected tab is an amazon_in page THEN default product vendors list is returned`() = + runTest { + val tab = createTab( + url = "https://www.amazon.in/product", + id = "test-tab", + ) + val browserState = BrowserState( + tabs = listOf(tab), + selectedTabId = tab.id, + ) + + val tested = DefaultReviewQualityCheckVendorsService(BrowserStore(browserState)) + + val actual = tested.productVendors() + val expected = listOf( + ProductVendor.AMAZON, + ProductVendor.BEST_BUY, + ProductVendor.WALMART, + ) + assertEquals(expected, actual) } } diff --git a/app/src/test/java/org/mozilla/fenix/shopping/middleware/EnumMapperTest.kt b/app/src/test/java/org/mozilla/fenix/shopping/middleware/EnumMapperTest.kt index 64101cf20065..df8dc930022c 100644 --- a/app/src/test/java/org/mozilla/fenix/shopping/middleware/EnumMapperTest.kt +++ b/app/src/test/java/org/mozilla/fenix/shopping/middleware/EnumMapperTest.kt @@ -23,11 +23,13 @@ class EnumMapperTest { val tablet = "TABLET" val wearable = "WEARABLE" val other = "other_type" + val otherWithSpace = "other type" assertEquals(DeviceType.PHONE, phone.asEnumOrDefault()) assertEquals(DeviceType.TABLET, tablet.asEnumOrDefault()) assertEquals(DeviceType.WEARABLE, wearable.asEnumOrDefault()) assertEquals(DeviceType.OTHER_TYPE, other.asEnumOrDefault()) + assertEquals(DeviceType.OTHER_TYPE, otherWithSpace.asEnumOrDefault()) } @Test diff --git a/app/src/test/java/org/mozilla/fenix/shopping/middleware/ProductAnalysisMapperTest.kt b/app/src/test/java/org/mozilla/fenix/shopping/middleware/ProductAnalysisMapperTest.kt index 5c40be7eb127..4c33bd9f7bdf 100644 --- a/app/src/test/java/org/mozilla/fenix/shopping/middleware/ProductAnalysisMapperTest.kt +++ b/app/src/test/java/org/mozilla/fenix/shopping/middleware/ProductAnalysisMapperTest.kt @@ -35,16 +35,16 @@ class ProductAnalysisMapperTest { val expected = ProductAnalysisTestData.analysisPresent( productId = "id1", reviewGrade = ReviewQualityCheckState.Grade.C, - analysisStatus = AnalysisStatus.UP_TO_DATE, + analysisStatus = AnalysisStatus.UpToDate, adjustedRating = 3.4f, productUrl = "https://example.com", highlightsInfo = HighlightsInfo( mapOf( - HighlightType.QUALITY to listOf("\"quality\""), - HighlightType.PRICE to listOf("\"price\""), - HighlightType.SHIPPING to listOf("\"shipping\""), - HighlightType.PACKAGING_AND_APPEARANCE to listOf("\"appearance\""), - HighlightType.COMPETITIVENESS to listOf("\"competitiveness\""), + HighlightType.QUALITY to listOf("quality"), + HighlightType.PRICE to listOf("price"), + HighlightType.SHIPPING to listOf("shipping"), + HighlightType.PACKAGING_AND_APPEARANCE to listOf("appearance"), + HighlightType.COMPETITIVENESS to listOf("competitiveness"), ), ), ) @@ -72,14 +72,14 @@ class ProductAnalysisMapperTest { val expected = ProductAnalysisTestData.analysisPresent( productId = "id1", reviewGrade = ReviewQualityCheckState.Grade.C, - analysisStatus = AnalysisStatus.NEEDS_ANALYSIS, + analysisStatus = AnalysisStatus.NeedsAnalysis, adjustedRating = 3.4f, productUrl = "https://example.com", highlightsInfo = HighlightsInfo( mapOf( - HighlightType.QUALITY to listOf("\"quality\""), - HighlightType.PACKAGING_AND_APPEARANCE to listOf("\"appearance\""), - HighlightType.COMPETITIVENESS to listOf("\"competitiveness\""), + HighlightType.QUALITY to listOf("quality"), + HighlightType.PACKAGING_AND_APPEARANCE to listOf("appearance"), + HighlightType.COMPETITIVENESS to listOf("competitiveness"), ), ), ) @@ -100,7 +100,7 @@ class ProductAnalysisMapperTest { val expected = ProductAnalysisTestData.analysisPresent( productId = "id1", reviewGrade = null, - analysisStatus = AnalysisStatus.UP_TO_DATE, + analysisStatus = AnalysisStatus.UpToDate, adjustedRating = 3.4f, productUrl = "https://example.com", ) @@ -162,7 +162,7 @@ class ProductAnalysisMapperTest { val expected = ProductAnalysisTestData.analysisPresent( productId = "1", reviewGrade = ReviewQualityCheckState.Grade.A, - analysisStatus = AnalysisStatus.UP_TO_DATE, + analysisStatus = AnalysisStatus.UpToDate, adjustedRating = 4.5f, productUrl = "https://test.com", ) @@ -180,7 +180,7 @@ class ProductAnalysisMapperTest { val expected = ProductAnalysisTestData.analysisPresent( productId = "1", reviewGrade = ReviewQualityCheckState.Grade.A, - analysisStatus = AnalysisStatus.NEEDS_ANALYSIS, + analysisStatus = AnalysisStatus.NeedsAnalysis, adjustedRating = 4.5f, productUrl = "https://test.com", highlightsInfo = null, @@ -255,9 +255,9 @@ class ProductAnalysisMapperTest { adjustedRating = null, highlightsInfo = HighlightsInfo( mapOf( - HighlightType.QUALITY to listOf("\"quality\""), - HighlightType.PACKAGING_AND_APPEARANCE to listOf("\"appearance\""), - HighlightType.COMPETITIVENESS to listOf("\"competitiveness\""), + HighlightType.QUALITY to listOf("quality"), + HighlightType.PACKAGING_AND_APPEARANCE to listOf("appearance"), + HighlightType.COMPETITIVENESS to listOf("competitiveness"), ), ), ) @@ -284,9 +284,9 @@ class ProductAnalysisMapperTest { adjustedRating = null, highlightsInfo = HighlightsInfo( mapOf( - HighlightType.QUALITY to listOf("\"quality\""), - HighlightType.PACKAGING_AND_APPEARANCE to listOf("\"appearance\""), - HighlightType.COMPETITIVENESS to listOf("\"competitiveness\""), + HighlightType.QUALITY to listOf("quality"), + HighlightType.PACKAGING_AND_APPEARANCE to listOf("appearance"), + HighlightType.COMPETITIVENESS to listOf("competitiveness"), ), ), ) @@ -313,9 +313,9 @@ class ProductAnalysisMapperTest { adjustedRating = 3.4f, highlightsInfo = HighlightsInfo( mapOf( - HighlightType.QUALITY to listOf("\"quality\""), - HighlightType.PACKAGING_AND_APPEARANCE to listOf("\"appearance\""), - HighlightType.COMPETITIVENESS to listOf("\"competitiveness\""), + HighlightType.QUALITY to listOf("quality"), + HighlightType.PACKAGING_AND_APPEARANCE to listOf("appearance"), + HighlightType.COMPETITIVENESS to listOf("competitiveness"), ), ), ) @@ -334,4 +334,28 @@ class ProductAnalysisMapperTest { assertEquals(expected, actual) } + + @Test + fun `WHEN product deleted is true and has not been reported THEN it is mapped to not available and not back in stock`() { + val actual = ProductAnalysisTestData.productAnalysis( + deletedProduct = true, + deletedProductReported = false, + ).toProductReviewState() + + val expected = + ReviewQualityCheckState.OptedIn.ProductReviewState.Error.ProductNotAvailable + assertEquals(expected, actual) + } + + @Test + fun `WHEN product deleted is true and has been reported THEN it is mapped to not available and back in stock`() { + val actual = ProductAnalysisTestData.productAnalysis( + deletedProduct = true, + deletedProductReported = true, + ).toProductReviewState() + + val expected = + ReviewQualityCheckState.OptedIn.ProductReviewState.Error.ProductAlreadyReported + assertEquals(expected, actual) + } } diff --git a/app/src/test/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckTelemetryMiddlewareTest.kt b/app/src/test/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckTelemetryMiddlewareTest.kt index 269f8a273c02..328a5b279488 100644 --- a/app/src/test/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckTelemetryMiddlewareTest.kt +++ b/app/src/test/java/org/mozilla/fenix/shopping/middleware/ReviewQualityCheckTelemetryMiddlewareTest.kt @@ -4,10 +4,15 @@ package org.mozilla.fenix.shopping.middleware +import kotlinx.coroutines.test.runTest +import mozilla.components.browser.state.state.BrowserState +import mozilla.components.browser.state.state.createTab +import mozilla.components.browser.state.store.BrowserStore import mozilla.components.service.glean.testing.GleanTestRule import mozilla.components.support.test.ext.joinBlocking import mozilla.components.support.test.libstate.ext.waitUntilIdle import mozilla.components.support.test.robolectric.testContext +import mozilla.components.support.test.rule.MainCoroutineRule import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull @@ -16,6 +21,7 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.GleanMetrics.Shopping +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.shopping.ProductAnalysisTestData import org.mozilla.fenix.shopping.store.BottomSheetDismissSource @@ -31,14 +37,15 @@ class ReviewQualityCheckTelemetryMiddlewareTest { @get:Rule val gleanTestRule = GleanTestRule(testContext) + @get:Rule + val coroutinesTestRule = MainCoroutineRule() + private lateinit var store: ReviewQualityCheckStore @Before fun setup() { store = ReviewQualityCheckStore( - middleware = listOf( - ReviewQualityCheckTelemetryMiddleware(), - ), + middleware = provideTelemetryMiddleware(), ) store.waitUntilIdle() } @@ -53,18 +60,23 @@ class ReviewQualityCheckTelemetryMiddlewareTest { @Test fun `WHEN the bottom sheet is closed THEN the bottom sheet closed event is recorded`() { - store.dispatch(ReviewQualityCheckAction.BottomSheetClosed(BottomSheetDismissSource.CLICK_OUTSIDE)).joinBlocking() + store.dispatch(ReviewQualityCheckAction.BottomSheetClosed(BottomSheetDismissSource.CLICK_OUTSIDE)) + .joinBlocking() store.waitUntilIdle() assertNotNull(Shopping.surfaceClosed.testGetValue()) val event = Shopping.surfaceClosed.testGetValue()!! assertEquals(1, event.size) - assertEquals(BottomSheetDismissSource.CLICK_OUTSIDE.sourceName, event.single().extra?.getValue("source")) + assertEquals( + BottomSheetDismissSource.CLICK_OUTSIDE.sourceName, + event.single().extra?.getValue("source"), + ) } @Test fun `WHEN the bottom sheet is displayed THEN the bottom sheet displayed event is recorded`() { - store.dispatch(ReviewQualityCheckAction.BottomSheetDisplayed(BottomSheetViewState.HALF_VIEW)).joinBlocking() + store.dispatch(ReviewQualityCheckAction.BottomSheetDisplayed(BottomSheetViewState.HALF_VIEW)) + .joinBlocking() store.waitUntilIdle() assertNotNull(Shopping.surfaceDisplayed.testGetValue()) @@ -122,9 +134,7 @@ class ReviewQualityCheckTelemetryMiddlewareTest { productVendor = ReviewQualityCheckState.ProductVendor.AMAZON, isHighlightsExpanded = false, ), - middleware = listOf( - ReviewQualityCheckTelemetryMiddleware(), - ), + middleware = provideTelemetryMiddleware(), ) tested.waitUntilIdle() tested.dispatch(ReviewQualityCheckAction.ExpandCollapseHighlights).joinBlocking() @@ -142,9 +152,7 @@ class ReviewQualityCheckTelemetryMiddlewareTest { productVendor = ReviewQualityCheckState.ProductVendor.AMAZON, isHighlightsExpanded = true, ), - middleware = listOf( - ReviewQualityCheckTelemetryMiddleware(), - ), + middleware = provideTelemetryMiddleware(), ) tested.waitUntilIdle() tested.dispatch(ReviewQualityCheckAction.ExpandCollapseHighlights).joinBlocking() @@ -162,9 +170,7 @@ class ReviewQualityCheckTelemetryMiddlewareTest { productVendor = ReviewQualityCheckState.ProductVendor.AMAZON, isSettingsExpanded = false, ), - middleware = listOf( - ReviewQualityCheckTelemetryMiddleware(), - ), + middleware = provideTelemetryMiddleware(), ) tested.waitUntilIdle() tested.dispatch(ReviewQualityCheckAction.ExpandCollapseSettings).joinBlocking() @@ -182,9 +188,7 @@ class ReviewQualityCheckTelemetryMiddlewareTest { productVendor = ReviewQualityCheckState.ProductVendor.AMAZON, isSettingsExpanded = true, ), - middleware = listOf( - ReviewQualityCheckTelemetryMiddleware(), - ), + middleware = provideTelemetryMiddleware(), ) tested.waitUntilIdle() tested.dispatch(ReviewQualityCheckAction.ExpandCollapseSettings).joinBlocking() @@ -244,7 +248,7 @@ class ReviewQualityCheckTelemetryMiddlewareTest { @Test fun `GIVEN a product review has been updated WHEN restore analysis is false THEN the stale analysis event is recorded`() { val productReviewState = ProductAnalysisTestData.analysisPresent( - analysisStatus = AnalysisPresent.AnalysisStatus.NEEDS_ANALYSIS, + analysisStatus = AnalysisPresent.AnalysisStatus.NeedsAnalysis, ) val tested = ReviewQualityCheckStore( @@ -253,7 +257,7 @@ class ReviewQualityCheckTelemetryMiddlewareTest { productRecommendationsExposure = true, productVendor = ReviewQualityCheckState.ProductVendor.BEST_BUY, ), - middleware = listOf(ReviewQualityCheckTelemetryMiddleware()), + middleware = provideTelemetryMiddleware(), ) tested.dispatch( @@ -270,7 +274,15 @@ class ReviewQualityCheckTelemetryMiddlewareTest { @Test fun `GIVEN a product review has been updated WHEN restore analysis is true THEN the stale analysis event is not recorded`() { val productReviewState = ProductAnalysisTestData.analysisPresent( - analysisStatus = AnalysisPresent.AnalysisStatus.NEEDS_ANALYSIS, + analysisStatus = AnalysisPresent.AnalysisStatus.NeedsAnalysis, + ) + val tested = ReviewQualityCheckStore( + initialState = ReviewQualityCheckState.OptedIn( + productRecommendationsPreference = null, + productRecommendationsExposure = true, + productVendor = ReviewQualityCheckState.ProductVendor.BEST_BUY, + ), + middleware = provideTelemetryMiddleware(), ) val tested = ReviewQualityCheckStore( initialState = ReviewQualityCheckState.OptedIn( @@ -302,7 +314,7 @@ class ReviewQualityCheckTelemetryMiddlewareTest { productRecommendationsExposure = true, productVendor = ReviewQualityCheckState.ProductVendor.BEST_BUY, ), - middleware = listOf(ReviewQualityCheckTelemetryMiddleware()), + middleware = provideTelemetryMiddleware(), ) tested.dispatch( @@ -317,20 +329,136 @@ class ReviewQualityCheckTelemetryMiddlewareTest { } @Test - fun `WHEN a product recommendation is visible for more than one and a half seconds THEN ad impression telemetry probe is sent`() { - store.dispatch(ReviewQualityCheckAction.RecommendedProductImpression("")).joinBlocking() - store.waitUntilIdle() + fun `GIVEN a recommendation impression action is dispatched WHEN app state does not contain key with tab id, product url and aid THEN ad impression telemetry probe is sent`() = + runTest { + var productViewed: String? = null + val tested = ReviewQualityCheckStore( + middleware = provideTelemetryMiddleware( + reviewQualityCheckTelemetryService = FakeReviewQualityCheckTelemetryService( + recordImpression = { + productViewed = it + }, + ), + browserState = BrowserState( + selectedTabId = "tabId", + tabs = listOf( + createTab( + id = "tabId", + url = "pdp", + ), + ), + ), + ), + ) + tested.waitUntilIdle() + tested.dispatch(ReviewQualityCheckAction.RecommendedProductImpression("productId")) + .joinBlocking() + tested.waitUntilIdle() + + assertNotNull(Shopping.surfaceAdsImpression.testGetValue()) + assertEquals("productId", productViewed) + } - assertNotNull(Shopping.surfaceAdsImpression.testGetValue()) - } + @Test + fun `WHEN recommendation impression action is dispatched many times and app state does not initially contain key with tab id, product url and aid THEN ad impression telemetry probe is sent only once`() = + runTest { + var productViewed: String? = null + var impressionCount = 0 + val appStore = AppStore() + val tested = ReviewQualityCheckStore( + middleware = provideTelemetryMiddleware( + reviewQualityCheckTelemetryService = FakeReviewQualityCheckTelemetryService( + recordImpression = { + productViewed = it + impressionCount++ + }, + ), + browserState = BrowserState( + selectedTabId = "tabId", + tabs = listOf( + createTab( + id = "tabId", + url = "pdp", + ), + ), + ), + appStore = appStore, + ), + ) + tested.waitUntilIdle() + for (i in 1..100) { + tested.dispatch(ReviewQualityCheckAction.RecommendedProductImpression("productId")) + .joinBlocking() + tested.waitUntilIdle() + appStore.waitUntilIdle() + } + + assertNotNull(Shopping.surfaceAdsImpression.testGetValue()) + assertEquals("productId", productViewed) + assertEquals(1, impressionCount) + } @Test - fun `WHEN a product recommendation is clicked THEN the ad clicked telemetry probe is sent`() { - store.dispatch(ReviewQualityCheckAction.RecommendedProductClick("", "")).joinBlocking() - store.waitUntilIdle() + fun `GIVEN a recommendation impression action is dispatched WHEN app state contains key with tab id, product url and aid THEN ad impression telemetry probe is NOT sent`() = + runTest { + var productViewed: String? = null + val tested = ReviewQualityCheckStore( + middleware = provideTelemetryMiddleware( + reviewQualityCheckTelemetryService = FakeReviewQualityCheckTelemetryService( + recordImpression = { productViewed = it }, + ), + browserState = BrowserState( + selectedTabId = "tabId", + tabs = listOf( + createTab( + id = "tabId", + url = "pdp", + ), + ), + ), + appStore = AppStore( + AppState( + shoppingState = ShoppingState( + recordedProductRecommendationImpressions = setOf( + ShoppingState.ProductRecommendationImpressionKey( + tabId = "tabId", + productUrl = "pdp", + aid = "productId", + ), + ), + ), + ), + ), + ), + ) + tested.waitUntilIdle() + tested.dispatch(ReviewQualityCheckAction.RecommendedProductImpression("productId")) + .joinBlocking() + tested.waitUntilIdle() + + assertNull(Shopping.surfaceAdsImpression.testGetValue()) + assertNull(productViewed) + } - assertNotNull(Shopping.surfaceAdsClicked.testGetValue()) - } + @Test + fun `WHEN a product recommendation is clicked THEN the ad clicked telemetry probe is sent`() = + runTest { + var productClicked: String? = null + val tested = ReviewQualityCheckStore( + middleware = provideTelemetryMiddleware( + reviewQualityCheckTelemetryService = FakeReviewQualityCheckTelemetryService( + recordClick = { productClicked = it }, + ), + ), + ) + tested.waitUntilIdle() + tested.dispatch(ReviewQualityCheckAction.RecommendedProductClick("productId", "")) + .joinBlocking() + tested.waitUntilIdle() + + assertNotNull(Shopping.surfaceAdsClicked.testGetValue()) + assertEquals("productId", productClicked) + } @Test fun `GIVEN the user has opted in WHEN the user switches product recommendations on THEN send enabled product recommendations toggled telemetry probe`() { @@ -341,15 +469,16 @@ class ReviewQualityCheckTelemetryMiddlewareTest { productVendor = ReviewQualityCheckState.ProductVendor.AMAZON, isHighlightsExpanded = false, ), - middleware = listOf( - ReviewQualityCheckTelemetryMiddleware(), - ), + middleware = provideTelemetryMiddleware(), ) tested.waitUntilIdle() tested.dispatch(ReviewQualityCheckAction.ToggleProductRecommendation).joinBlocking() tested.waitUntilIdle() - assertEquals("enabled", Shopping.surfaceAdsSettingToggled.testGetValue()!!.first().extra!!["action"]) + assertEquals( + "enabled", + Shopping.surfaceAdsSettingToggled.testGetValue()!!.first().extra!!["action"], + ) } @Test @@ -361,14 +490,28 @@ class ReviewQualityCheckTelemetryMiddlewareTest { productVendor = ReviewQualityCheckState.ProductVendor.AMAZON, isHighlightsExpanded = false, ), - middleware = listOf( - ReviewQualityCheckTelemetryMiddleware(), - ), + middleware = provideTelemetryMiddleware(), ) tested.waitUntilIdle() tested.dispatch(ReviewQualityCheckAction.ToggleProductRecommendation).joinBlocking() tested.waitUntilIdle() - assertEquals("disabled", Shopping.surfaceAdsSettingToggled.testGetValue()!!.first().extra!!["action"]) + assertEquals( + "disabled", + Shopping.surfaceAdsSettingToggled.testGetValue()!!.first().extra!!["action"], + ) } + + private fun provideTelemetryMiddleware( + reviewQualityCheckTelemetryService: FakeReviewQualityCheckTelemetryService = FakeReviewQualityCheckTelemetryService(), + browserState: BrowserState = BrowserState(), + appStore: AppStore = AppStore(), + ) = listOf( + ReviewQualityCheckTelemetryMiddleware( + reviewQualityCheckTelemetryService, + BrowserStore(browserState), + appStore, + coroutinesTestRule.scope, + ), + ) } diff --git a/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStateTest.kt b/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStateTest.kt index 69112bb5009a..708d98dc01c5 100644 --- a/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStateTest.kt +++ b/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStateTest.kt @@ -11,6 +11,7 @@ import org.junit.Assert.assertTrue import org.junit.Test import org.mozilla.fenix.shopping.ProductAnalysisTestData import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent.HighlightsInfo +import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.Progress class ReviewQualityCheckStateTest { @@ -224,4 +225,23 @@ class ReviewQualityCheckStateTest { assertTrue(analysis.highlightsInfo!!.showMoreButtonVisible) assertFalse(analysis.highlightsInfo!!.highlightsFadeVisible) } + + @Test + fun `WHEN progress has a positive value THEN normalized progress should match`() { + val progress = Progress(61.6f) + assertEquals(0.616f, progress.normalizedProgress) + } + + @Test + fun `WHEN no analysis is present with progress THEN normalized progress should match and progress bar is visible`() { + val analysis = ProductAnalysisTestData.noAnalysisPresent(progress = 61.6f) + assertTrue(analysis.isProgressBarVisible) + assertEquals(0.616f, analysis.progress.normalizedProgress) + } + + @Test + fun `WHEN no analysis is present with negative progress THEN progress bar is not visible`() { + val analysis = ProductAnalysisTestData.noAnalysisPresent(progress = -1f) + assertFalse(analysis.isProgressBarVisible) + } } diff --git a/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStoreTest.kt b/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStoreTest.kt index a714cf61599c..254fef74381e 100644 --- a/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStoreTest.kt +++ b/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStoreTest.kt @@ -32,12 +32,15 @@ import org.mozilla.fenix.shopping.fake.FakeReviewQualityCheckService import org.mozilla.fenix.shopping.fake.FakeReviewQualityCheckVendorsService import org.mozilla.fenix.shopping.fake.FakeShoppingExperienceFeature import org.mozilla.fenix.shopping.middleware.AnalysisStatusDto +import org.mozilla.fenix.shopping.middleware.AnalysisStatusProgressDto import org.mozilla.fenix.shopping.middleware.NetworkChecker +import org.mozilla.fenix.shopping.middleware.ReportBackInStockStatusDto import org.mozilla.fenix.shopping.middleware.ReviewQualityCheckNetworkMiddleware import org.mozilla.fenix.shopping.middleware.ReviewQualityCheckPreferences import org.mozilla.fenix.shopping.middleware.ReviewQualityCheckPreferencesMiddleware import org.mozilla.fenix.shopping.middleware.ReviewQualityCheckService import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent.AnalysisStatus +import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.Progress import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.ProductVendor import java.util.Locale @@ -217,6 +220,135 @@ class ReviewQualityCheckStoreTest { assertEquals(expected, tested.state) } + @Test + fun `GIVEN product recommendations are available WHEN the user turns product recommendations off THEN state should not contain product recommendation`() = + runTest { + setAndResetLocale { + var productRecommendationsFetchCounter = 0 + val tested = ReviewQualityCheckStore( + middleware = provideReviewQualityCheckMiddleware( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences( + isEnabled = true, + isProductRecommendationsEnabled = true, + ), + reviewQualityCheckService = FakeReviewQualityCheckService( + productAnalysis = { ProductAnalysisTestData.productAnalysis() }, + productRecommendation = { + productRecommendationsFetchCounter++ + ProductRecommendationTestData.productRecommendation() + }, + ), + ), + ) + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + tested.dispatch(ReviewQualityCheckAction.FetchProductAnalysis).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + + assertEquals(1, productRecommendationsFetchCounter) + + tested.dispatch(ReviewQualityCheckAction.ToggleProductRecommendation).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + + val expected = ReviewQualityCheckState.OptedIn( + productRecommendationsPreference = false, + productRecommendationsExposure = true, + productVendor = ProductVendor.BEST_BUY, + productReviewState = ProductAnalysisTestData.analysisPresent(), + ) + assertEquals(expected, tested.state) + assertEquals(1, productRecommendationsFetchCounter) + } + } + + @Test + fun `GIVEN product recommendations are available WHEN the user turns product recommendations off and then back on THEN state should contain product recommendation`() = + runTest { + setAndResetLocale { + val tested = ReviewQualityCheckStore( + middleware = provideReviewQualityCheckMiddleware( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences( + isEnabled = true, + isProductRecommendationsEnabled = true, + ), + reviewQualityCheckService = FakeReviewQualityCheckService( + productAnalysis = { ProductAnalysisTestData.productAnalysis() }, + productRecommendation = { ProductRecommendationTestData.productRecommendation() }, + ), + shoppingExperienceFeature = FakeShoppingExperienceFeature( + productRecommendationsExposureEnabled = true, + ), + ), + ) + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + tested.dispatch(ReviewQualityCheckAction.FetchProductAnalysis).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + tested.dispatch(ReviewQualityCheckAction.ToggleProductRecommendation).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + tested.dispatch(ReviewQualityCheckAction.ToggleProductRecommendation).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + + val expected = ReviewQualityCheckState.OptedIn( + productRecommendationsPreference = true, + productRecommendationsExposure = true, + productVendor = ProductVendor.BEST_BUY, + productReviewState = ProductAnalysisTestData.analysisPresent( + recommendedProductState = ProductRecommendationTestData.product(), + ), + ) + assertEquals(expected, tested.state) + } + } + + @Test + fun `GIVEN product recommendations are available but analysis failed WHEN the user turns product recommendations on THEN recommendations should not be fetched`() = + runTest { + setAndResetLocale { + var productRecommendationsFetchCounter = 0 + val tested = ReviewQualityCheckStore( + middleware = provideReviewQualityCheckMiddleware( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences( + isEnabled = true, + isProductRecommendationsEnabled = false, + ), + reviewQualityCheckService = FakeReviewQualityCheckService( + productAnalysis = { null }, + productRecommendation = { + productRecommendationsFetchCounter++ + ProductRecommendationTestData.productRecommendation() + }, + ), + ), + ) + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + tested.dispatch(ReviewQualityCheckAction.FetchProductAnalysis).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + + assertEquals(0, productRecommendationsFetchCounter) + + tested.dispatch(ReviewQualityCheckAction.ToggleProductRecommendation).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + + val expected = ReviewQualityCheckState.OptedIn( + productRecommendationsPreference = true, + productRecommendationsExposure = true, + productVendor = ProductVendor.BEST_BUY, + productReviewState = ReviewQualityCheckState.OptedIn.ProductReviewState.Error.GenericError, + ) + assertEquals(expected, tested.state) + assertEquals(0, productRecommendationsFetchCounter) + } + } + @Test fun `GIVEN the user has opted in the feature WHEN there is existing card state data for a pdp THEN it should be restored`() = runTest { @@ -261,7 +393,6 @@ class ReviewQualityCheckStoreTest { assertEquals(expected, tested.state) } - @Ignore("Flaky: https://bugzilla.mozilla.org/show_bug.cgi?id=1865318") @Test fun `GIVEN the user has opted in the feature WHEN the user expands settings THEN state should reflect that`() = runTest { @@ -283,6 +414,7 @@ class ReviewQualityCheckStoreTest { tested.dispatch(ReviewQualityCheckAction.ExpandCollapseSettings).joinBlocking() tested.waitUntilIdle() dispatcher.scheduler.advanceUntilIdle() + appStore.waitUntilIdle() val expected = ReviewQualityCheckState.OptedIn( productRecommendationsPreference = false, @@ -296,7 +428,6 @@ class ReviewQualityCheckStoreTest { } } - @Ignore("Flaky: https://bugzilla.mozilla.org/show_bug.cgi?id=1865318") @Test fun `GIVEN the user has opted in the feature WHEN the user collapses settings THEN state should reflect that`() = runTest { @@ -327,6 +458,7 @@ class ReviewQualityCheckStoreTest { tested.dispatch(ReviewQualityCheckAction.ExpandCollapseSettings).joinBlocking() tested.waitUntilIdle() dispatcher.scheduler.advanceUntilIdle() + appStore.waitUntilIdle() val expected = ReviewQualityCheckState.OptedIn( productRecommendationsPreference = false, @@ -340,7 +472,6 @@ class ReviewQualityCheckStoreTest { } } - @Ignore("Flaky: https://bugzilla.mozilla.org/show_bug.cgi?id=1865318") @Test fun `GIVEN the user has opted in the feature WHEN the user expands info card THEN state should reflect that`() = runTest { @@ -362,6 +493,7 @@ class ReviewQualityCheckStoreTest { tested.dispatch(ReviewQualityCheckAction.ExpandCollapseInfo).joinBlocking() tested.waitUntilIdle() dispatcher.scheduler.advanceUntilIdle() + appStore.waitUntilIdle() val expected = ReviewQualityCheckState.OptedIn( productRecommendationsPreference = false, @@ -375,7 +507,6 @@ class ReviewQualityCheckStoreTest { } } - @Ignore("Flaky: https://bugzilla.mozilla.org/show_bug.cgi?id=1865318") @Test fun `GIVEN the user has opted in the feature WHEN the user collapses info card THEN state should reflect that`() = runTest { @@ -406,6 +537,7 @@ class ReviewQualityCheckStoreTest { tested.dispatch(ReviewQualityCheckAction.ExpandCollapseInfo).joinBlocking() tested.waitUntilIdle() dispatcher.scheduler.advanceUntilIdle() + appStore.waitUntilIdle() val expected = ReviewQualityCheckState.OptedIn( productRecommendationsPreference = false, @@ -419,7 +551,6 @@ class ReviewQualityCheckStoreTest { } } - @Ignore("Flaky: https://bugzilla.mozilla.org/show_bug.cgi?id=1865318") @Test fun `GIVEN the user has opted in the feature WHEN the user expands highlights card THEN state should reflect that`() = runTest { @@ -442,6 +573,7 @@ class ReviewQualityCheckStoreTest { tested.dispatch(ReviewQualityCheckAction.ExpandCollapseHighlights).joinBlocking() tested.waitUntilIdle() dispatcher.scheduler.advanceUntilIdle() + appStore.waitUntilIdle() val expected = ReviewQualityCheckState.OptedIn( productRecommendationsPreference = false, @@ -456,7 +588,6 @@ class ReviewQualityCheckStoreTest { } } - @Ignore("Flaky: https://bugzilla.mozilla.org/show_bug.cgi?id=1865318") @Test fun `GIVEN the user has opted in the feature WHEN the user collapses highlights card THEN state should reflect that`() = runTest { @@ -487,6 +618,7 @@ class ReviewQualityCheckStoreTest { tested.dispatch(ReviewQualityCheckAction.ExpandCollapseHighlights).joinBlocking() tested.waitUntilIdle() dispatcher.scheduler.advanceUntilIdle() + appStore.waitUntilIdle() val expected = ReviewQualityCheckState.OptedIn( productRecommendationsPreference = false, @@ -624,7 +756,7 @@ class ReviewQualityCheckStoreTest { reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true), reviewQualityCheckService = FakeReviewQualityCheckService( reanalysis = AnalysisStatusDto.PENDING, - status = null, + statusProgress = { null }, productAnalysis = { productAnalysisList[it] }, ), networkChecker = FakeNetworkChecker(isConnected = true), @@ -643,7 +775,7 @@ class ReviewQualityCheckStoreTest { val expected = ReviewQualityCheckState.OptedIn( productReviewState = ProductAnalysisTestData.analysisPresent( reviewGrade = ReviewQualityCheckState.Grade.B, - analysisStatus = AnalysisStatus.NEEDS_ANALYSIS, + analysisStatus = AnalysisStatus.NeedsAnalysis, ), productRecommendationsPreference = false, productRecommendationsExposure = true, @@ -661,7 +793,12 @@ class ReviewQualityCheckStoreTest { reviewQualityCheckService = FakeReviewQualityCheckService( productAnalysis = { ProductAnalysisTestData.productAnalysis() }, reanalysis = AnalysisStatusDto.PENDING, - status = AnalysisStatusDto.COMPLETED, + statusProgress = { + AnalysisStatusProgressDto( + status = AnalysisStatusDto.COMPLETED, + progress = 100.0, + ) + }, ), networkChecker = FakeNetworkChecker(isConnected = true), ), @@ -695,7 +832,12 @@ class ReviewQualityCheckStoreTest { ) }, reanalysis = AnalysisStatusDto.PENDING, - status = AnalysisStatusDto.COMPLETED, + statusProgress = { + AnalysisStatusProgressDto( + status = AnalysisStatusDto.COMPLETED, + progress = 100.0, + ) + }, ), networkChecker = FakeNetworkChecker(isConnected = true), ), @@ -716,9 +858,30 @@ class ReviewQualityCheckStoreTest { assertEquals(expected, tested.state) } + @Ignore("Disabled until intermittent is resolved. See Bug 1869566") @Test fun `GIVEN a product analysis WHEN analysis status is in progress or pending THEN state should be updated to reanalysing`() = runTest { + val statusProgressResponses = listOf( + AnalysisStatusProgressDto( + status = AnalysisStatusDto.IN_PROGRESS, + progress = 50.0, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.IN_PROGRESS, + progress = 61.6, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.IN_PROGRESS, + progress = 92.52, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.COMPLETED, + progress = 100.0, + ), + ) + var counter = 0 + val tested = ReviewQualityCheckStore( middleware = provideReviewQualityCheckMiddleware( reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true), @@ -727,7 +890,9 @@ class ReviewQualityCheckStoreTest { ProductAnalysisTestData.productAnalysis() }, reanalysis = AnalysisStatusDto.PENDING, - status = AnalysisStatusDto.IN_PROGRESS, + statusProgress = { + statusProgressResponses[counter].also { counter++ } + }, ), networkChecker = FakeNetworkChecker(isConnected = true), ), @@ -745,18 +910,112 @@ class ReviewQualityCheckStoreTest { tested.waitUntilIdle() dispatcher.scheduler.advanceUntilIdle() - val expected = ReviewQualityCheckState.OptedIn( + val expectedProgressState1 = ReviewQualityCheckState.OptedIn( + productReviewState = ProductAnalysisTestData.analysisPresent( + analysisStatus = AnalysisStatus.Reanalyzing(Progress(61.6f)), + ), + productRecommendationsPreference = false, + productRecommendationsExposure = true, + productVendor = ProductVendor.BEST_BUY, + ) + + val expectedProgressState2 = expectedProgressState1.copy( + productReviewState = ProductAnalysisTestData.analysisPresent( + analysisStatus = AnalysisStatus.Reanalyzing(Progress(92.52f)), + ), + ) + + // Since reanalyzing is an intermediate state and the tests completes to get to the final + // state, this checks if the intermediate state is present in the observed state. + assertTrue(observedState.contains(expectedProgressState1)) + assertTrue(observedState.contains(expectedProgressState2)) + } + + @Ignore("Disabled until intermittent is resolved. See Bug 1869566") + @Test + fun `GIVEN reanalyse product is clicked WHEN analysis status is in progress or pending THEN state should be updated to reanalysing`() = + runTest { + val statusProgressResponses = listOf( + AnalysisStatusProgressDto( + status = AnalysisStatusDto.OTHER, + progress = 0.0, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.IN_PROGRESS, + progress = 30.0, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.IN_PROGRESS, + progress = 61.6, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.IN_PROGRESS, + progress = 92.52, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.COMPLETED, + progress = 100.0, + ), + ) + var counter = 0 + + val tested = ReviewQualityCheckStore( + middleware = provideReviewQualityCheckMiddleware( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true), + reviewQualityCheckService = FakeReviewQualityCheckService( + productAnalysis = { + ProductAnalysisTestData.productAnalysis() + }, + reanalysis = AnalysisStatusDto.PENDING, + statusProgress = { + statusProgressResponses[counter].also { counter++ } + }, + ), + networkChecker = FakeNetworkChecker(isConnected = true), + ), + ) + + val observedState = mutableListOf() + tested.observeForever { + observedState.add(it) + } + + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + tested.dispatch(ReviewQualityCheckAction.FetchProductAnalysis).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + tested.dispatch(ReviewQualityCheckAction.ReanalyzeProduct).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + + val expectedProgressState1 = ReviewQualityCheckState.OptedIn( productReviewState = ProductAnalysisTestData.analysisPresent( - analysisStatus = AnalysisStatus.REANALYZING, + analysisStatus = AnalysisStatus.Reanalyzing(Progress(30f)), ), productRecommendationsPreference = false, productRecommendationsExposure = true, productVendor = ProductVendor.BEST_BUY, ) + val expectedProgressState2 = expectedProgressState1.copy( + productReviewState = ProductAnalysisTestData.analysisPresent( + analysisStatus = AnalysisStatus.Reanalyzing(Progress(61.6f)), + ), + ) + + val expectedProgressState3 = expectedProgressState1.copy( + productReviewState = ProductAnalysisTestData.analysisPresent( + analysisStatus = AnalysisStatus.Reanalyzing(Progress(92.52f)), + ), + ) + // Since reanalyzing is an intermediate state and the tests completes to get to the final // state, this checks if the intermediate state is present in the observed state. - assertTrue(observedState.contains(expected)) + assertTrue(observedState.contains(expectedProgressState1)) + assertTrue(observedState.contains(expectedProgressState2)) + assertTrue(observedState.contains(expectedProgressState3)) } @Test @@ -770,7 +1029,12 @@ class ReviewQualityCheckStoreTest { ProductAnalysisTestData.productAnalysis(needsAnalysis = true) }, reanalysis = AnalysisStatusDto.COMPLETED, - status = AnalysisStatusDto.COMPLETED, + statusProgress = { + AnalysisStatusProgressDto( + status = AnalysisStatusDto.COMPLETED, + progress = 100.0, + ) + }, ), networkChecker = FakeNetworkChecker(isConnected = true), ), @@ -790,7 +1054,7 @@ class ReviewQualityCheckStoreTest { val expected = ReviewQualityCheckState.OptedIn( productReviewState = ProductAnalysisTestData.analysisPresent( - analysisStatus = AnalysisStatus.NEEDS_ANALYSIS, + analysisStatus = AnalysisStatus.NeedsAnalysis, ), productRecommendationsPreference = false, productRecommendationsExposure = true, @@ -800,7 +1064,7 @@ class ReviewQualityCheckStoreTest { val notExpected = ReviewQualityCheckState.OptedIn( productReviewState = ProductAnalysisTestData.analysisPresent( - analysisStatus = AnalysisStatus.REANALYZING, + analysisStatus = AnalysisStatus.Reanalyzing(Progress(0f)), ), productRecommendationsPreference = false, productRecommendationsExposure = true, @@ -820,7 +1084,7 @@ class ReviewQualityCheckStoreTest { ProductAnalysisTestData.productAnalysis() }, reanalysis = null, - status = null, + statusProgress = { null }, ), networkChecker = FakeNetworkChecker(isConnected = true), ), @@ -848,7 +1112,7 @@ class ReviewQualityCheckStoreTest { val notExpected = ReviewQualityCheckState.OptedIn( productReviewState = ProductAnalysisTestData.analysisPresent( - analysisStatus = AnalysisStatus.REANALYZING, + analysisStatus = AnalysisStatus.Reanalyzing(Progress(0f)), ), productRecommendationsPreference = false, productRecommendationsExposure = true, @@ -857,6 +1121,283 @@ class ReviewQualityCheckStoreTest { assertFalse(observedState.contains(notExpected)) } + @Ignore("Disabled until intermittent is resolved. See Bug 1869566") + @Test + fun `GIVEN no analysis WHEN analysis is in progress THEN state should update to no analysis present with progress`() = + runTest { + val statusProgressResponses = listOf( + AnalysisStatusProgressDto( + status = AnalysisStatusDto.IN_PROGRESS, + progress = 30.0, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.IN_PROGRESS, + progress = 61.6, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.IN_PROGRESS, + progress = 92.52, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.COMPLETED, + progress = 100.0, + ), + ) + var counter = 0 + + val tested = ReviewQualityCheckStore( + middleware = provideReviewQualityCheckMiddleware( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true), + reviewQualityCheckService = FakeReviewQualityCheckService( + productAnalysis = { + ProductAnalysisTestData.productAnalysis( + grade = null, + adjustedRating = null, + needsAnalysis = true, + ) + }, + reanalysis = AnalysisStatusDto.PENDING, + statusProgress = { + statusProgressResponses[counter].also { counter++ } + }, + ), + networkChecker = FakeNetworkChecker(isConnected = true), + ), + ) + + val observedState = mutableListOf() + tested.observeForever { + observedState.add(it) + } + + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + tested.dispatch(ReviewQualityCheckAction.FetchProductAnalysis).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + + val expectedProgressState1 = ReviewQualityCheckState.OptedIn( + productReviewState = ProductAnalysisTestData.noAnalysisPresent( + progress = 61.6f, + ), + productRecommendationsPreference = false, + productRecommendationsExposure = true, + productVendor = ProductVendor.BEST_BUY, + ) + + val expectedProgressState2 = expectedProgressState1.copy( + productReviewState = ProductAnalysisTestData.noAnalysisPresent( + progress = 92.52f, + ), + ) + + // Since reanalyzing is an intermediate state and the tests completes to get to the final + // state, this checks if the intermediate state is present in the observed state. + assertTrue(observedState.contains(expectedProgressState1)) + assertTrue(observedState.contains(expectedProgressState2)) + } + + @Ignore("Disabled until intermittent is resolved. See Bug 1869566") + @Test + fun `GIVEN no analysis WHEN reanalyze THEN state should update to no analysis present with progress`() = + runTest { + val statusProgressResponses = listOf( + AnalysisStatusProgressDto( + status = AnalysisStatusDto.OTHER, + progress = 0.0, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.IN_PROGRESS, + progress = 30.0, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.IN_PROGRESS, + progress = 61.6, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.IN_PROGRESS, + progress = 92.52, + ), + AnalysisStatusProgressDto( + status = AnalysisStatusDto.COMPLETED, + progress = 100.0, + ), + ) + var counter = 0 + + val tested = ReviewQualityCheckStore( + middleware = provideReviewQualityCheckMiddleware( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true), + reviewQualityCheckService = FakeReviewQualityCheckService( + productAnalysis = { + ProductAnalysisTestData.productAnalysis( + grade = null, + adjustedRating = null, + needsAnalysis = true, + ) + }, + reanalysis = AnalysisStatusDto.PENDING, + statusProgress = { + statusProgressResponses[counter].also { counter++ } + }, + ), + networkChecker = FakeNetworkChecker(isConnected = true), + ), + ) + + val observedState = mutableListOf() + tested.observeForever { + observedState.add(it) + } + + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + tested.dispatch(ReviewQualityCheckAction.FetchProductAnalysis).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + tested.dispatch(ReviewQualityCheckAction.ReanalyzeProduct).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + + val expectedProgressState1 = ReviewQualityCheckState.OptedIn( + productReviewState = ProductAnalysisTestData.noAnalysisPresent( + progress = 30f, + ), + productRecommendationsPreference = false, + productRecommendationsExposure = true, + productVendor = ProductVendor.BEST_BUY, + ) + + val expectedProgressState2 = expectedProgressState1.copy( + productReviewState = ProductAnalysisTestData.noAnalysisPresent( + progress = 61.6f, + ), + ) + + val expectedProgressState3 = expectedProgressState1.copy( + productReviewState = ProductAnalysisTestData.noAnalysisPresent( + progress = 92.52f, + ), + ) + + // Since reanalyzing is an intermediate state and the tests completes to get to the final + // state, this checks if the intermediate state is present in the observed state. + assertTrue(observedState.contains(expectedProgressState1)) + assertTrue(observedState.contains(expectedProgressState2)) + assertTrue(observedState.contains(expectedProgressState3)) + } + + @Test + fun `GIVEN deletedProduct is true and deletedProductReported is false WHEN report back in stock is clicked THEN thanks for reporting card is shown`() = + runTest { + val tested = ReviewQualityCheckStore( + middleware = provideReviewQualityCheckMiddleware( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true), + reviewQualityCheckService = FakeReviewQualityCheckService( + productAnalysis = { + ProductAnalysisTestData.productAnalysis( + deletedProduct = true, + deletedProductReported = false, + ) + }, + reanalysis = AnalysisStatusDto.PENDING, + statusProgress = { null }, + report = ReportBackInStockStatusDto.REPORT_CREATED, + ), + networkChecker = FakeNetworkChecker(isConnected = true), + ), + ) + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + tested.dispatch(ReviewQualityCheckAction.FetchProductAnalysis).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + + val expected = ReviewQualityCheckState.OptedIn( + productReviewState = ReviewQualityCheckState.OptedIn.ProductReviewState.Error.ProductNotAvailable, + productRecommendationsPreference = false, + productRecommendationsExposure = true, + productVendor = ProductVendor.BEST_BUY, + ) + assertEquals(expected, tested.state) + + tested.dispatch(ReviewQualityCheckAction.ReportProductBackInStock).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + + val reportExpected = expected.copy( + productReviewState = ReviewQualityCheckState.OptedIn.ProductReviewState.Error.ThanksForReporting, + ) + assertEquals(reportExpected, tested.state) + } + + @Test + fun `GIVEN deletedProduct is true WHEN report back in stock returns not deleted THEN state is updated to no analysis`() = + runTest { + val tested = ReviewQualityCheckStore( + middleware = provideReviewQualityCheckMiddleware( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true), + reviewQualityCheckService = FakeReviewQualityCheckService( + productAnalysis = { + ProductAnalysisTestData.productAnalysis( + deletedProduct = true, + deletedProductReported = false, + ) + }, + reanalysis = AnalysisStatusDto.PENDING, + statusProgress = { null }, + report = ReportBackInStockStatusDto.NOT_DELETED, + ), + networkChecker = FakeNetworkChecker(isConnected = true), + ), + ) + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + tested.dispatch(ReviewQualityCheckAction.FetchProductAnalysis).joinBlocking() + tested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + + val expected = ReviewQualityCheckState.OptedIn( + productReviewState = ReviewQualityCheckState.OptedIn.ProductReviewState.Error.ProductNotAvailable, + productRecommendationsPreference = false, + productRecommendationsExposure = true, + productVendor = ProductVendor.BEST_BUY, + ) + assertEquals(expected, tested.state) + + val noAnalysisTested = ReviewQualityCheckStore( + middleware = provideReviewQualityCheckMiddleware( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true), + reviewQualityCheckService = FakeReviewQualityCheckService( + productAnalysis = { + ProductAnalysisTestData.productAnalysis( + grade = null, + adjustedRating = null, + needsAnalysis = true, + ) + }, + reanalysis = AnalysisStatusDto.PENDING, + statusProgress = { null }, + report = ReportBackInStockStatusDto.NOT_DELETED, + ), + networkChecker = FakeNetworkChecker(isConnected = true), + ), + ) + + noAnalysisTested.dispatch(ReviewQualityCheckAction.ReportProductBackInStock).joinBlocking() + noAnalysisTested.waitUntilIdle() + dispatcher.scheduler.advanceUntilIdle() + + val reportExpected = expected.copy( + productReviewState = ProductAnalysisTestData.noAnalysisPresent(progress = -1f), + ) + assertEquals(reportExpected, noAnalysisTested.state) + } + @Test fun `GIVEN product recommendations are enabled WHEN a product analysis is fetched successfully THEN product recommendation should also be fetched and displayed if available`() = runTest { @@ -1077,81 +1618,6 @@ class ReviewQualityCheckStoreTest { captureActionsMiddleware.assertNotDispatched(ReviewQualityCheckAction.UpdateRecommendedProduct::class) } - @Test - fun `GIVEN product recommendations are enabled WHEN recommended product is clicked THEN click event is recorded`() = - runTest { - var productClicked: String? = null - val tested = ReviewQualityCheckStore( - middleware = provideReviewQualityCheckMiddleware( - reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences( - isEnabled = true, - isProductRecommendationsEnabled = true, - ), - reviewQualityCheckService = FakeReviewQualityCheckService( - productAnalysis = { ProductAnalysisTestData.productAnalysis() }, - productRecommendation = { - ProductRecommendationTestData.productRecommendation( - aid = "342", - ) - }, - recordClick = { - productClicked = it - }, - ), - ), - ) - tested.waitUntilIdle() - dispatcher.scheduler.advanceUntilIdle() - tested.waitUntilIdle() - tested.dispatch(ReviewQualityCheckAction.FetchProductAnalysis).joinBlocking() - tested.waitUntilIdle() - dispatcher.scheduler.advanceUntilIdle() - tested.dispatch( - ReviewQualityCheckAction.RecommendedProductClick( - productAid = "342", - productUrl = "https://test.com", - ), - ).joinBlocking() - - assertEquals("342", productClicked) - } - - @Test - fun `GIVEN product recommendations are enabled WHEN recommended product is viewed THEN impression event is recorded`() = - runTest { - var productViewed: String? = null - val tested = ReviewQualityCheckStore( - middleware = provideReviewQualityCheckMiddleware( - reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences( - isEnabled = true, - isProductRecommendationsEnabled = true, - ), - reviewQualityCheckService = FakeReviewQualityCheckService( - productAnalysis = { ProductAnalysisTestData.productAnalysis() }, - productRecommendation = { - ProductRecommendationTestData.productRecommendation( - aid = "342", - ) - }, - recordImpression = { - productViewed = it - }, - ), - ), - ) - tested.waitUntilIdle() - dispatcher.scheduler.advanceUntilIdle() - tested.waitUntilIdle() - tested.dispatch(ReviewQualityCheckAction.FetchProductAnalysis).joinBlocking() - tested.waitUntilIdle() - dispatcher.scheduler.advanceUntilIdle() - tested.dispatch( - ReviewQualityCheckAction.RecommendedProductImpression(productAid = "342"), - ).joinBlocking() - - assertEquals("342", productViewed) - } - private fun provideReviewQualityCheckMiddleware( reviewQualityCheckPreferences: ReviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(), reviewQualityCheckVendorsService: FakeReviewQualityCheckVendorsService = FakeReviewQualityCheckVendorsService(), diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt index 0b5db351a5ea..82d73cd67484 100644 --- a/app/src/test/java/org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt @@ -68,6 +68,7 @@ import org.mozilla.fenix.ext.maxActiveTime import org.mozilla.fenix.ext.potentialInactiveTabs import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.home.HomeFragment +import org.mozilla.fenix.library.bookmarks.BookmarksSharedViewModel import org.mozilla.fenix.utils.Settings import java.util.concurrent.TimeUnit @@ -103,6 +104,8 @@ class DefaultTabsTrayControllerTest { private val bookmarksUseCase: BookmarksUseCase = mockk(relaxed = true) private val collectionStorage: TabCollectionStorage = mockk(relaxed = true) + private val bookmarksSharedViewModel: BookmarksSharedViewModel = mockk(relaxed = true) + private val coroutinesTestRule: MainCoroutineRule = MainCoroutineRule() private val testDispatcher = coroutinesTestRule.testDispatcher @@ -1089,7 +1092,7 @@ class DefaultTabsTrayControllerTest { }, ).handleBookmarkSelectedTabsClicked() - coVerify(exactly = 1) { bookmarksUseCase.addBookmark(any(), any(), any()) } + coVerify(exactly = 1) { bookmarksUseCase.addBookmark(any(), any(), any(), any()) } assertTrue(showBookmarkSnackbarInvoked) assertNotNull(TabsTray.bookmarkSelectedTabs.testGetValue()) @@ -1155,6 +1158,7 @@ class DefaultTabsTrayControllerTest { showCancelledDownloadWarning = showCancelledDownloadWarning, showCollectionSnackbar = showCollectionSnackbar, showBookmarkSnackbar = showBookmarkSnackbar, + bookmarksSharedViewModel = bookmarksSharedViewModel, ) } } diff --git a/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt b/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt index f03aec22c110..7006be6081e6 100644 --- a/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt +++ b/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt @@ -828,10 +828,10 @@ class SettingsTest { } @Test - fun `GIVEN hasUserBeenOnboarded is false and isLauncherIntent is false THEN shouldShowJunoOnboarding returns false`() { + fun `GIVEN hasUserBeenOnboarded is false and isLauncherIntent is false THEN shouldShowOnboarding returns false`() { val settings = spyk(settings) - val actual = settings.shouldShowJunoOnboarding( + val actual = settings.shouldShowOnboarding( hasUserBeenOnboarded = false, isLauncherIntent = false, ) @@ -840,10 +840,10 @@ class SettingsTest { } @Test - fun `GIVEN hasUserBeenOnboarded is true THEN shouldShowJunoOnboarding returns false`() { + fun `GIVEN hasUserBeenOnboarded is true THEN shouldShowOnboarding returns false`() { val settings = spyk(settings) - val actual = settings.shouldShowJunoOnboarding( + val actual = settings.shouldShowOnboarding( hasUserBeenOnboarded = true, isLauncherIntent = true, ) @@ -852,10 +852,10 @@ class SettingsTest { } @Test - fun `GIVEN hasUserBeenOnboarded is false and isLauncherIntent is true THEN shouldShowJunoOnboarding returns true`() { + fun `GIVEN hasUserBeenOnboarded is false and isLauncherIntent is true THEN shouldShowOnboarding returns true`() { val settings = spyk(settings) - val actual = settings.shouldShowJunoOnboarding( + val actual = settings.shouldShowOnboarding( hasUserBeenOnboarded = false, isLauncherIntent = true, ) diff --git a/automation/taskcluster/androidTest/flank-arm-legacy-api-tests.yml b/automation/taskcluster/androidTest/flank-arm-legacy-api-tests.yml index bfb5e6dac706..8712be3613bc 100644 --- a/automation/taskcluster/androidTest/flank-arm-legacy-api-tests.yml +++ b/automation/taskcluster/androidTest/flank-arm-legacy-api-tests.yml @@ -26,7 +26,6 @@ gcloud: - class org.mozilla.fenix.ui.MainMenuTest#goBackTest - class org.mozilla.fenix.ui.MainMenuTest#goForwardTest - class org.mozilla.fenix.ui.HistoryTest#verifyHistoryMenuWithHistoryItemsTest - - class org.mozilla.fenix.ui.SettingsSearchTest#verifyShowSearchSuggestionsToggleTest - class org.mozilla.fenix.ui.CollectionTest#deleteCollectionTest - class org.mozilla.fenix.ui.HistoryTest#noHistoryInPrivateBrowsingTest - class org.mozilla.fenix.ui.TabbedBrowsingTest#openNewTabTest diff --git a/automation/taskcluster/androidTest/flank-arm-robo-test.yml b/automation/taskcluster/androidTest/flank-arm-robo-test.yml index f80a24a2145c..813452db4752 100644 --- a/automation/taskcluster/androidTest/flank-arm-robo-test.yml +++ b/automation/taskcluster/androidTest/flank-arm-robo-test.yml @@ -14,8 +14,8 @@ gcloud: clearPackageData: true device: - - model: Pixel2.arm - version: 26 + - model: java + version: 30 locale: en_US - model: Pixel2.arm version: 27 diff --git a/automation/taskcluster/androidTest/lib/testrail_conn.py b/automation/taskcluster/androidTest/lib/testrail_conn.py new file mode 100644 index 000000000000..41d1f2667e96 --- /dev/null +++ b/automation/taskcluster/androidTest/lib/testrail_conn.py @@ -0,0 +1,102 @@ +# flake8: noqa +"""TestRail API binding for Python 3.x. + +(API v2, available since TestRail 3.0) + +Compatible with TestRail 3.0 and later. + +Learn more: + +http://docs.gurock.com/testrail-api2/start +http://docs.gurock.com/testrail-api2/accessing + +Copyright Gurock Software GmbH. See license.md for details. +""" + +import base64 +import json + +import requests + + +class APIClient: + def __init__(self, base_url): + self.user = '' + self.password = '' + if not base_url.endswith('/'): + base_url += '/' + self.__url = base_url + 'index.php?/api/v2/' + + def send_get(self, uri, filepath=None): + """Issue a GET request (read) against the API. + + Args: + uri: The API method to call including parameters, e.g. get_case/1. + filepath: The path and file name for attachment download; used only + for 'get_attachment/:attachment_id'. + + Returns: + A dict containing the result of the request. + """ + return self.__send_request('GET', uri, filepath) + + def send_post(self, uri, data): + """Issue a POST request (write) against the API. + + Args: + uri: The API method to call, including parameters, e.g. add_case/1. + data: The data to submit as part of the request as a dict; strings + must be UTF-8 encoded. If adding an attachment, must be the + path to the file. + + Returns: + A dict containing the result of the request. + """ + return self.__send_request('POST', uri, data) + + def __send_request(self, method, uri, data): + url = self.__url + uri + + auth = str( + base64.b64encode( + bytes('%s:%s' % (self.user, self.password), 'utf-8') + ), + 'ascii' + ).strip() + headers = {'Authorization': 'Basic ' + auth} + + if method == 'POST': + if uri[:14] == 'add_attachment': # add_attachment API method + files = {'attachment': (open(data, 'rb'))} + response = requests.post(url, headers=headers, files=files) + files['attachment'].close() + else: + headers['Content-Type'] = 'application/json' + payload = bytes(json.dumps(data), 'utf-8') + response = requests.post(url, headers=headers, data=payload) + else: + headers['Content-Type'] = 'application/json' + response = requests.get(url, headers=headers) + + if response.status_code > 201: + try: + error = response.json() + except requests.exceptions.HTTPError: # response.content not formatted as JSON + error = str(response.content) + raise APIError('TestRail API returned HTTP %s (%s)' % (response.status_code, error)) + else: + if uri[:15] == 'get_attachment/': # Expecting file, not JSON + try: + open(data, 'wb').write(response.content) + return (data) + except FileNotFoundError: + return ("Error saving attachment.") + else: + try: + return response.json() + except requests.exceptions.HTTPError: + return {} + + +class APIError(Exception): + pass diff --git a/automation/taskcluster/androidTest/testrail.py b/automation/taskcluster/androidTest/testrail.py new file mode 100644 index 000000000000..b75efa7c3d80 --- /dev/null +++ b/automation/taskcluster/androidTest/testrail.py @@ -0,0 +1,154 @@ +""" +This Python script is designed to automate the process of creating milestones +and test runs in TestRail, and updating test cases based on the results of +automated smoke tests for different product releases. + +Below is a summary of its functionality in order of execution: + +1. Environment and Credentials Setup: + - Imports necessary libraries and modules. + - Loads environmental variables from "execution_metadata.env". + - Reads and processes TestRail credentials from '.testrail_credentials.json'. + +2. Environment Variables Validation: + - Retrieves and validates several environment variables like `PRODUCT_TYPE`, + `RELEASE_TYPE`, `VERSION_NUMBER`, and `TEST_STATUS`. + - Ensures `TEST_STATUS` is either 'PASS' or 'FAIL'. + +3. Utility Functions: + - `parse_release_number()`: Parses the version number to extract a specific part. + - `build_milestone_name()`: Constructs a milestone name based on product type, + release type, and version number. + - `build_milestone_description()`: Creates a detailed description for the milestone + including the current date and placeholders for various testing statuses. + +4. TestRail Integration: + - Defines a `TestRail` class that handles interactions with the TestRail API. + - Includes methods to create milestones, create test runs, and update test cases. + +5. Main Execution: + - Checks if `TEST_STATUS` is 'PASS'. If not, it raises an error to trigger a Slack notification. + - Sets parameters for a demo TestRail project. + - Instantiates the `TestRail` class. + - Creates a milestone in TestRail and retrieves its ID. + - Creates test runs for each device/API combination (currently hardcoded for phase 1 testing) + and updates test cases to 'passed' status. + +6. Phase 1 and Phase 2 Notes: + - The script is currently in Phase 1, where certain values are hardcoded for testing. + - In Phase 2, these hardcoded values will be parameterized for broader usage. +""" + + +import json +import os +import textwrap +from lib.testrail_conn import APIClient +from dotenv import load_dotenv +from datetime import datetime + +try: + load_dotenv("execution_metadata.env") # Attempt to load .env file +except FileNotFoundError: + raise FileNotFoundError("The .env file was not found.") +except Exception as e: + raise Exception(f"An error occurred while loading the .env file: {e}") + +try: + with open('.testrail_credentials.json', 'r') as file: + secret = json.load(file) + TESTRAIL_HOST = secret['host'] + TESTRAIL_USERNAME = secret['username'] + TESTRAIL_PASSWORD = secret['password'] +except json.JSONDecodeError as e: + raise ValueError("Failed to load testrail credentials : {e}") + +try: + PRODUCT_TYPE = os.environ["PRODUCT_TYPE"] + RELEASE_TYPE = os.environ["RELEASE_TYPE"] + VERSION_NUMBER = os.environ["MOBILE_HEAD_REF"] + TEST_STATUS = os.environ["TEST_STATUS"] + + if TEST_STATUS not in ('PASS', 'FAIL'): + raise ValueError(f"ERROR: Invalid TEST_STATUS value: {TEST_STATUS}") +except KeyError as e: + raise ValueError(f"ERROR: Missing Environment Variable: {e}") + +def parse_release_number(VERSION_NUMBER): + parts = VERSION_NUMBER.split('_') + return parts[1] + +def build_milestone_name(product_type, release_type, version_number): + return f"Automated smoke testing sign-off - {product_type} {release_type} {version_number}" + +def build_milestone_description(milestone_name): + current_date = datetime.now() + formatted_date = current_date = current_date.strftime("%B %d, %Y") + return textwrap.dedent(f""" + RELEASE: {milestone_name}\n\n\ + RELEASE_TAG_URL: https://github.com/mozilla-mobile/firefox-android/releases\n\n\ + RELEASE_DATE: {formatted_date}\n\n\ + TESTING_STATUS: [ TBD ]\n\n\ + QA_RECOMMENDATION:[ TBD ]\n\n\ + QA_RECOMENTATION_VERBOSE: \n\n\ + TESTING_SUMMARY\n\n\ + Known issues: n/a\n\ + New issue: n/a\n\ + Verified issue: + """) + +class TestRail(): + + def __init__(self): + try: + self.client = APIClient(TESTRAIL_HOST) + self.client.user = TESTRAIL_USERNAME + self.client.password = TESTRAIL_PASSWORD + except KeyError as e: + raise ValueError(f"ERROR: Missing Testrail Env Var: {e}") + + # Public Methods + + def create_milestone(self, testrail_project_id, title, description): + data = {"name": title, "description": description} + return self.client.send_post(f'add_milestone/{testrail_project_id}', data) + + def create_test_run(self, testrail_project_id, testrail_milestone_id, name_run, testrail_suite_id): + data = {"name": name_run, "milestone_id": testrail_milestone_id, "suite_id": testrail_suite_id} + return self.client.send_post(f'add_run/{testrail_project_id}', data) + + def update_test_cases_to_passed(self, testrail_project_id, testrail_run_id, testrail_suite_id): + test_cases = self._get_test_cases(testrail_project_id, testrail_suite_id) + data = { "results": [{"case_id": test_case['id'], "status_id": 1} for test_case in test_cases]} + return testrail._update_test_run_results(testrail_run_id, data) + + # Private Methods + + def _get_test_cases(self, testrail_project_id, testrail_test_suite_id): + return self.client.send_get(f'get_cases/{testrail_project_id}&suite_id={testrail_test_suite_id}') + + def _update_test_run_results(self, testrail_run_id, data): + return self.client.send_post(f'add_results_for_cases/{testrail_run_id}', data) + +if __name__ == "__main__": + if TEST_STATUS != 'PASS': + raise ValueError("Tests failed. Sending Slack Notification....") + + # There are for a dummy Testrail project used for Phase 1 testing of this script + # They will be parameterized during Phase 2 of script hardening + PROJECT_ID = 53 # Firefox for FireTV + TEST_SUITE_ID = 45442 # Demo Test Suite + + testrail = TestRail() + milestone_name = build_milestone_name(PRODUCT_TYPE, RELEASE_TYPE, parse_release_number(VERSION_NUMBER)) + milestone_description = build_milestone_description(milestone_name) + + # Create milestone for 'Firefox for FireTV' and store the ID + milestone_id = testrail.create_milestone(PROJECT_ID, milestone_name, milestone_description)['id'] + + # Create test run for each Device/API and update test cases to 'passed' + # The Firebase Test devices are temporarily hard-coded during testing + # and will be parameterized in Phase 2 of hardening + for test_run_name in ['Google Pixel 32(Android11)', 'Google Pixel2(Android9)']: + test_run_id = testrail.create_test_run(PROJECT_ID, milestone_id, test_run_name, TEST_SUITE_ID)['id'] + testrail.update_test_cases_to_passed(PROJECT_ID, test_run_id, TEST_SUITE_ID) diff --git a/automation/taskcluster/androidTest/ui-test.sh b/automation/taskcluster/androidTest/ui-test.sh index a0498d8f5799..a4df3971b968 100755 --- a/automation/taskcluster/androidTest/ui-test.sh +++ b/automation/taskcluster/androidTest/ui-test.sh @@ -102,10 +102,18 @@ function failure_check() { echo if [[ $exitcode -ne 0 ]]; then echo "FAILURE: UI test run failed, please check above URL" + TEST_STATUS="FAIL" else - echo "All UI test(s) have passed!" + echo "All UI test(s) have passed!" + TEST_STATUS="PASS" fi + { + echo "TEST_STATUS=${TEST_STATUS}" + echo "PRODUCT_TYPE=${PRODUCT_TYPE}" + echo "RELEASE_TYPE=${RELEASE_TYPE}" + } >> execution_metadata.env + echo echo "RESULTS" echo diff --git a/build.gradle b/build.gradle index 7d21a7211e2b..2720111e15e9 100644 --- a/build.gradle +++ b/build.gradle @@ -175,8 +175,21 @@ allprojects { } } +subprojects { + afterEvaluate { + if (it.hasProperty('android')) { + android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + } + } + } +} + tasks.register('clean', Delete) { - delete rootProject.buildDir + delete rootProject.layout.buildDirectory } detekt { diff --git a/docs/Guide-to-merging-contributor-PRs.md b/docs/Guide-to-merging-contributor-PRs.md index b1c5cecf1092..e42f889af685 100644 --- a/docs/Guide-to-merging-contributor-PRs.md +++ b/docs/Guide-to-merging-contributor-PRs.md @@ -1,6 +1,6 @@ # Guide to merging contributor PRs for Firefox Android team members -Contributor PRs will run only a specific suite of CI tests (excluding UI tests) in order to protect secrets. Use the following steps when reviewing and merging a contributor PR. +Contributor PRs will run only a specific suite of CI tests (excluding UI tests) in order to protect secrets. Use the following steps when reviewing and merging a contributor PR. ## Process for landing contributor PR _Note: these instructions use https://cli.github.com/_ @@ -17,13 +17,58 @@ gh pr checkout 1234 # for https://github.com/mozilla-mobile/firefox-android/pull 3. Review the code to make sure everything is clean. -4. Once a Firefox Android team member has reviewed the PR and deemed it safe, comment the following to start UI tests. -```bors try``` +4. ~~Once a Firefox Android team member has reviewed the PR and deemed it safe, comment the following to start UI tests. + ```bors try```~~ + `Bors` public instance is now offline, as they announced in [their newsletter](https://bugzilla.mozilla.org/show_bug.cgi?id=1850420). Please refer to section "Process for running UI tests on a contributor PR" above. + 5. Once the UI tests have all completed and passed, approve the PR and add `approved` and `needs landing` label the contributor's PR. 6. Monitor the merging process to make sure it lands as expected. +## Process for running UI tests on a contributor PR + +1. Make sure you have already checked out the contributor's branch onto your fork, following the previous session's first step. +```sh +git fetch --all +gh pr checkout + +# Example: +gh pr checkout 1234 # for https://github.com/mozilla-mobile/firefox-android/pull/1234 +``` + +3. Rename your local branch's to any name +``` +git branch -m + +# Example: If the contributor's branch is named `eliserichards:my-fun-branch1` +git branch -m ci-for-my-fun-branch1 +``` + +3. Push branch to your fork using any branch name: +```sh +git push origin + +# Example: If the contributor's branch is named `eliserichards:my-fun-branch1` +git push origin ci-for-my-fun-branch1 +``` + +4. Create a PR from _your fork's_ copy of the branch e.g. https://github.com/mozilla-mobile/firefox-android/compare/main...eliserichards:my-fun-branch1 + +* Please note in the PR description which PR you are running CI for. Example: https://github.com/mozilla-mobile/firefox-android/pull/4577 + +*** + +**Once you create this PR, the CI for both the original and the duplicate PRs will run. When everything is green, you can merge either of them.** + +5. To land the original: +* i. Make sure that contributor's branch hasn't diverged from yours (they must have the same SHA). +* ii. The change has to be on the top of the main branch when it is first in line in the merge queue. +* iii. It requires the needs-landing label. + +**NB**: Adding `needs-landing` label while failing to ensure the same SHA will block the mergify queue and will require manual intervention: mergify will trigger CI for the original PR again and wait for it to finish, but CI won’t run all the checks because there is no PR with the same SHA any more that backs it up. If that happens, talk to the release team. + + ## Process for updating contributor PR (if contributor needs help or is unresponsive) ```sh diff --git a/gradle.properties b/gradle.properties index efac0664eb19..e2189e2ca0fe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,3 +27,6 @@ libUrl=https://github.com/mozilla-mobile/firefox-android/tree/main/fenix libVcsUrl=https://github.com/mozilla-mobile/firefox-android.git libLicense=MPL-2.0 libLicenseUrl=https://www.mozilla.org/en-US/MPL/2.0/ +android.nonTransitiveRClass=false +android.nonFinalResIds=false +android.enableR8.fullMode=false diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index afba109285af..d64cd4917707 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b1624c473c42..1af9e0930b89 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 65dcd68d65c8..1aa94a426907 100755 --- a/gradlew +++ b/gradlew @@ -83,10 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,11 +198,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/ContextCompatDetectorTest.kt b/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/ContextCompatDetectorTest.kt index 658845be7130..9a8a7fa99c6f 100644 --- a/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/ContextCompatDetectorTest.kt +++ b/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/ContextCompatDetectorTest.kt @@ -102,7 +102,7 @@ class ContextCompatDetectorTest : LintDetectorTest() { | fun trigger(context: Context, id: Int) { | getDrawable(context, id) | } - | + | | fun getDrawable(context: Context, id: Int) {} | |}""".trimMargin() @@ -126,7 +126,7 @@ class ContextCompatDetectorTest : LintDetectorTest() { | fun trigger(context: Context, id: Int) { | getColorStateList(context, id) | } - | + | | fun getColorStateList(context: Context, id: Int) {} | |}""".trimMargin() @@ -160,4 +160,4 @@ class ContextCompatDetectorTest : LintDetectorTest() { |""".trimMargin() ) } -} \ No newline at end of file +} diff --git a/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/LicenseDetectorTest.kt b/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/LicenseDetectorTest.kt index 207445092190..c05cda163472 100644 --- a/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/LicenseDetectorTest.kt +++ b/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/LicenseDetectorTest.kt @@ -53,6 +53,7 @@ class LicenseDetectorTest : LintDetectorTest() { lint() .files(TestFiles.kt(code)) .allowMissingSdk(true) + .testModes(TestMode.UI_INJECTION_HOST) .run() .expect(expectedReport) .expectFixDiffs(expectedFixOutput) @@ -151,4 +152,4 @@ class LicenseDetectorTest : LintDetectorTest() { .expect(expectedReport) .expectFixDiffs(expectedFixOutput) } -} \ No newline at end of file +} diff --git a/plugins/apksize/build.gradle b/plugins/apksize/build.gradle index ebc7ab538273..77b077a8b30c 100644 --- a/plugins/apksize/build.gradle +++ b/plugins/apksize/build.gradle @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ plugins { - id "org.gradle.kotlin.kotlin-dsl" version "2.4.1" + id "org.gradle.kotlin.kotlin-dsl" version "4.1.2" } repositories { diff --git a/plugins/apksize/src/main/java/ApkSizePlugin.kt b/plugins/apksize/src/main/java/ApkSizePlugin.kt index 920d9c72b38a..6a70a4da88b0 100644 --- a/plugins/apksize/src/main/java/ApkSizePlugin.kt +++ b/plugins/apksize/src/main/java/ApkSizePlugin.kt @@ -48,7 +48,7 @@ open class ApkSizeTask : DefaultTask() { } private fun determineApkSizes(): Map { - val variantOutputPath = variantName?.removePrefix("fenix")?.toLowerCase() + val variantOutputPath = variantName?.removePrefix("fenix")?.lowercase() val basePath = listOf( "${project.projectDir}", "build", "outputs", "apk", "fenix", variantOutputPath ).joinToString(File.separator) @@ -107,10 +107,11 @@ open class ApkSizeTask : DefaultTask() { suite.put("value", getSummarySize(apkSize)) suite.put("lowerIsBetter", true) suite.put("alertChangeType", "absolute") + suite.put("alertThreshold", 1024 * 1024) // Debug variants do not have alerts - if (variantName?.contains("debug", ignoreCase = true) == false) { - suite.put("alertThreshold", 1024 * 1024) + if (variantName?.contains("debug", ignoreCase = true) == true) { + suite.put("shouldAlert", false) } val subtests = JSONArray() diff --git a/plugins/fenixdependencies/build.gradle b/plugins/fenixdependencies/build.gradle index 32cea475d461..7e8043a2a8f1 100644 --- a/plugins/fenixdependencies/build.gradle +++ b/plugins/fenixdependencies/build.gradle @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ plugins { - id "org.gradle.kotlin.kotlin-dsl" version "2.4.1" + id "org.gradle.kotlin.kotlin-dsl" version "4.1.2" } repositories { diff --git a/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt b/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt index 769772eaae3d..e7f73234e48b 100644 --- a/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt +++ b/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt @@ -19,7 +19,7 @@ object FenixVersions { const val fastlane = "2.1.1" const val androidx_activity = "1.7.2" - const val androidx_benchmark = "1.2.1" + const val androidx_benchmark = "1.2.2" const val androidx_profileinstaller = "1.3.1" const val androidx_legacy = "1.0.0" const val androidx_navigation = "2.5.3" @@ -32,7 +32,7 @@ object FenixVersions { const val installreferrer = "2.2" const val junit = "5.9.3" - const val mockk = "1.13.7" + const val mockk = "1.13.8" // keep in sync with the versions used in AS. const val protobuf = "3.21.10" diff --git a/version.txt b/version.txt index c69570a48cce..b6b8c77f00ef 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -121.1.0 +122.0