Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update to Privacy Pro settings footer #3679

Merged
merged 4 commits into from
Dec 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 80 additions & 32 deletions DuckDuckGo/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -37013,11 +37013,59 @@
"comment" : "Title shown in an error page tab that warn users of security risks on a website that has been flagged as Malware.",
"extractionState" : "extracted_with_value",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Warnung: Website ist möglicherweise bösartig"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Warning: Site May Be Malicious"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Advertencia: el sitio puede ser malicioso"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avertissement : le site est peut-être malveillant"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Attenzione: il sito potrebbe essere dannoso"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opgelet: Deze website kan schadelijk zijn"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ostrzeżenie: witryna może być złośliwa"
}
},
"pt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aviso: o site pode ser malicioso"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Внимание! Потенциально вредоносный сайт"
}
}
}
},
Expand Down Expand Up @@ -47104,8 +47152,8 @@
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Erlaube DuckDuckGo, dich zu warnen, bevor eine Webseite geladen wird, die als bösartig oder betrügerisch gekennzeichnet wurde."
"state" : "translated",
"value" : "Warne mich auf Websites, die als Phishing- oder Malware-Websites gekennzeichnet sind."
}
},
"en" : {
Expand All @@ -47116,44 +47164,44 @@
},
"es" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Permite que DuckDuckGo te avise antes de cargar una página web que se haya marcado como maliciosa o fraudulenta."
"state" : "translated",
"value" : "Avisarme sobre sitios marcados como phishing o malware."
}
},
"fr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Autorisez DuckDuckGo à vous avertir avant de charger une page Web signalée comme malveillante ou frauduleuse."
"state" : "translated",
"value" : "Mettez-moi en garde contre les sites signalés pour hameçonnage ou comme étant des logiciels malveillants."
}
},
"it" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Consenti a DuckDuckGo di avvisarti prima di caricare una pagina web contrassegnata come dannosa o fraudolenta."
"state" : "translated",
"value" : "Avvisami sui siti contrassegnati per phishing o malware."
}
},
"nl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Laat DuckDuckGo je waarschuwen voordat je een webpagina laadt die als kwaadaardig of frauduleus is gemarkeerd."
"state" : "translated",
"value" : "Waarschuw me op websites die zijn aangeduid als phishing of malware."
}
},
"pl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Zezwól DuckDuckGo na ostrzeganie przed załadowaniem strony internetowej, która została oznaczona jako złośliwa lub jako oszustwo."
"state" : "translated",
"value" : "Ostrzegaj mnie przed witrynami oznaczonymi jako wyłudzanie informacji lub złośliwe oprogramowanie."
}
},
"pt" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Permitir que o DuckDuckGo te avise antes de carregar uma página que foi sinalizada como maliciosa ou fraudulenta."
"state" : "translated",
"value" : "Avisar-me sobre sites sinalizados como phishing ou malware."
}
},
"ru" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Разрешить DuckDuckGo предупреждать вас о потенциально вредоносных или мошеннических сайтах перед загрузкой страницы."
"state" : "translated",
"value" : "Предупреждать о вредоносных и фишинговых сайтах"
}
}
}
Expand Down Expand Up @@ -47224,8 +47272,8 @@
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Das Deaktivieren dieser Funktion kann deine persönlichen Daten gefährden. Wenn du dir über die damit verbundenen Risiken im Klaren bist, kannst du trotzdem fortfahren."
"state" : "translated",
"value" : "Das Deaktivieren dieser Funktion kann deine persönlichen Daten gefährden."
}
},
"en" : {
Expand All @@ -47236,44 +47284,44 @@
},
"es" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Desactivar esta función puede poner en riesgo tu información personal. Hazlo solo si entiendes completamente el riesgo que implica."
"state" : "translated",
"value" : "Desactivar esta función puede poner en riesgo tu información personal."
}
},
"fr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "La désactivation de cette fonctionnalité peut mettre vos informations personnelles en danger. Faites-le uniquement si vous comprenez parfaitement les risques encourus."
"state" : "translated",
"value" : "La désactivation de cette fonctionnalité peut mettre vos informations personnelles en danger."
}
},
"it" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Disabilitando questa funzione, potresti mettere a rischio i tuoi dati personali. Fallo solo se comprendi appieno il rischio che comporta."
"state" : "translated",
"value" : "Disabilitando questa funzione, potresti mettere a rischio i tuoi dati personali."
}
},
"nl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Als je deze functie uitschakelt, kunnen je persoonlijke gegevens in gevaar komen. Doe dit alleen als je het risico volledig begrijpt."
"state" : "translated",
"value" : "Als je deze functie uitschakelt, kunnen je persoonlijke gegevens in gevaar komen."
}
},
"pl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Wyłączenie tej funkcji może narazić Twoje dane osobowe na ryzyko. Rób to tylko wtedy, gdy rozumiesz związane z tym zagrożenie."
"state" : "translated",
"value" : "Wyłączenie tej funkcji może narazić Twoje dane osobowe na ryzyko."
}
},
"pt" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Desativar esta funcionalidade pode pôr em risco as tuas informações pessoais. Não desatives a menos que compreendas os riscos."
"state" : "translated",
"value" : "Desativar esta funcionalidade pode pôr em risco as tuas informações pessoais."
}
},
"ru" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "При отключении этой функции ваши личные данные могут оказаться под угрозой. Эту функцию следует деактивировать только в том случае, если вы осознаете связанные с этим риски."
"state" : "translated",
"value" : "При отключении этой функции ваши личные данные могут оказаться под угрозой."
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,11 @@ public final class PreferencesSubscriptionModel: ObservableObject {
userEventHandler(.openFeedback)
}

@MainActor
func openPrivacyPolicy() {
openURLHandler(URL(string: "https://duckduckgo.com/pro/privacy-terms")!)
}

@MainActor
func refreshSubscriptionPendingState() {
if subscriptionManager.currentEnvironment.purchasePlatform == .appStore {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,6 @@ public struct PreferencesSubscriptionView: View {

// Help section
helpSection

// Feedback section
if subscriptionFeatureAvailability.usesUnifiedFeedbackForm, state == .subscriptionActive {
feedbackSection
}
}
.onAppear(perform: {
model.didAppear()
Expand Down Expand Up @@ -303,24 +298,21 @@ public struct PreferencesSubscriptionView: View {
private var helpSection: some View {
PreferencePaneSection {
TextMenuItemHeader(UserText.preferencesSubscriptionFooterTitle, bottomPadding: 0)
HStack(alignment: .top, spacing: 6) {
if !model.isROWLaunched {
TextMenuItemCaption(UserText.preferencesSubscriptionFooterCaption)
} else {
TextMenuItemCaption(UserText.preferencesSubscriptionHelpFooterCaption)
}
Button(UserText.viewFaqsButton) { model.openFAQ() }
if !model.isROWLaunched {
TextMenuItemCaption(UserText.preferencesSubscriptionFooterCaption)
.padding(.bottom, 8)
} else {
TextMenuItemCaption(UserText.preferencesSubscriptionHelpFooterCaption)
.padding(.bottom, 8)
}
}
}
VStack(alignment: .leading, spacing: 16) {
TextButton(UserText.viewFaqsButton, weight: .semibold) { model.openFAQ() }

@ViewBuilder
private var feedbackSection: some View {
PreferencePaneSection {
TextMenuItemHeader(UserText.preferencesSubscriptionFeedbackTitle, bottomPadding: 0)
HStack(alignment: .top, spacing: 6) {
TextMenuItemCaption(UserText.preferencesSubscriptionFeedbackCaption)
Button(UserText.preferencesSubscriptionFeedbackButton) { model.openUnifiedFeedbackForm() }
if subscriptionFeatureAvailability.usesUnifiedFeedbackForm, state == .subscriptionActive {
TextButton(UserText.preferencesSubscriptionFeedbackButton, weight: .semibold) { model.openUnifiedFeedbackForm() }
}

TextButton(UserText.preferencesPrivacyPolicyButton, weight: .semibold) { model.openPrivacyPolicy() }
}
}
}
Expand Down Expand Up @@ -495,6 +487,7 @@ private struct SubscriptionDialog<Buttons>: View where Buttons: View {
.fixMultilineScrollableText()
.foregroundColor(Color(.textPrimary))
} buttons: {
Spacer()
buttons()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2265,6 +2265,66 @@
}
}
},
"subscription.preferences.privacypolicy.button" : {
"comment" : "Title for the privacy policy button",
"extractionState" : "extracted_with_value",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Datenschutzerklärung und Nutzungsbedingungen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Privacy Policy and Terms of Service"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Política de privacidad y condiciones del servicio"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Politique de confidentialité et conditions d'utilisation"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Privacy policy e Termini del servizio"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Privacybeleid en servicevoorwaarden"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Polityka prywatności i warunki użytkowania"
}
},
"pt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Política de Privacidade e Termos de Serviço"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Политика конфиденциальности и условия обслуживания"
}
}
}
},
"subscription.preferences.purchase.button" : {
"comment" : "Button to open a page where user can learn more and purchase the subscription",
"extractionState" : "extracted_with_value",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ enum UserText {
static let preferencesSubscriptionFeedbackTitle = NSLocalizedString("subscription.preferences.feedback.title", bundle: Bundle.module, value: "Send Feedback", comment: "Title for the subscription feedback section")
static let preferencesSubscriptionFeedbackCaption = NSLocalizedString("subscription.preferences.feedback.caption", bundle: Bundle.module, value: "Help improve Privacy Pro. Your feedback matters to us. Feel free to report any issues or provide general feedback.", comment: "Caption for the subscription feedback section")
static let preferencesSubscriptionFeedbackButton = NSLocalizedString("subscription.preferences.feedback.button", bundle: Bundle.module, value: "Send Feedback", comment: "Title for the subscription feedback button")
static let preferencesPrivacyPolicyButton = NSLocalizedString("subscription.preferences.privacypolicy.button", bundle: Bundle.module, value: "Privacy Policy and Terms of Service", comment: "Title for the privacy policy button")

static func preferencesSubscriptionRenewingCaption(billingPeriod: Subscription.BillingPeriod, formattedDate: String) -> String {
let localized: String
Expand Down
Loading