Ensure full Spanish localization for all 1.2.0 strings

- OnboardingView: wrap page titles/descriptions with String(localized:)
  using symbolic keys so SwiftUI can look them up correctly
- IAPService.paywallBenefits: change from static let to static var,
  wrap all strings with String(localized:) using symbolic keys
- en.lproj: add symbolic keys for new onboarding pages and paywall benefits
- es-ES.lproj: add Spanish translations for all new keys (onboarding pages,
  paywall benefits, batch update, contribution fields) plus pre-existing
  gaps (Monthly Highlights, Best/Worst Performer, Best Contributor)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
alexandrev-tibco
2026-02-20 22:41:40 +01:00
parent 015e718b39
commit 472342fa67
4 changed files with 70 additions and 14 deletions
@@ -112,6 +112,16 @@
"feature_no_ads" = "No Ads";
"feature_no_ads_desc" = "Ad-free experience forever";
// Paywall benefits (1.2.0)
"paywall_benefit_history_title" = "Your complete history";
"paywall_benefit_history_subtitle" = "Every snapshot, contribution, and gain since day one";
"paywall_benefit_charts_title" = "Charts that reveal patterns";
"paywall_benefit_charts_subtitle" = "Allocation, drawdown, performance — all in one place";
"paywall_benefit_forecasts_title" = "12-month forecasts";
"paywall_benefit_forecasts_subtitle" = "See where your portfolio is likely heading";
"paywall_benefit_noads_title" = "No ads, ever";
"paywall_benefit_noads_subtitle" = "Clean, focused experience with no distractions";
// MARK: - Settings
"settings_title" = "Settings";
"subscription" = "Subscription";
@@ -177,6 +187,16 @@
"onboarding_sync_desc" = "Your data syncs automatically via iCloud across all your Apple devices.";
"get_started" = "Get Started";
// Onboarding pages (1.2.0)
"onboarding_clarity_title" = "Know exactly where you stand";
"onboarding_clarity_desc" = "See your total wealth, real returns, and allocation — always up to date.";
"onboarding_habit_title" = "5 minutes a month is enough";
"onboarding_habit_desc" = "Log your values once a month. Portfolio Journal handles the math and shows your progress.";
"onboarding_calm_title" = "Ignore the noise. Track the trend.";
"onboarding_calm_desc" = "Daily swings don't tell the real story. Your growth over months and years does.";
"onboarding_goals_title" = "Reach your financial goals";
"onboarding_goals_desc" = "Set targets, track milestones, and see exactly how far you've come.";
// MARK: - Errors
"error_generic" = "An error occurred. Please try again.";
"error_no_purchases" = "No purchases found to restore";
@@ -137,6 +137,26 @@
"Unlimited sources, advanced charts & more" = "Fuentes ilimitadas, gráficos avanzados y más";
"See full access" = "Ver acceso completo";
// Paywall benefits (1.2.0)
"paywall_benefit_history_title" = "Tu historial completo";
"paywall_benefit_history_subtitle" = "Cada snapshot, aportación y ganancia desde el primer día";
"paywall_benefit_charts_title" = "Gráficos que revelan patrones";
"paywall_benefit_charts_subtitle" = "Asignación, drawdown, rendimiento — todo en un lugar";
"paywall_benefit_forecasts_title" = "Previsiones a 12 meses";
"paywall_benefit_forecasts_subtitle" = "Ve a dónde se dirige tu cartera";
"paywall_benefit_noads_title" = "Sin anuncios, nunca";
"paywall_benefit_noads_subtitle" = "Una experiencia limpia y sin distracciones";
// MARK: - Onboarding pages (1.2.0)
"onboarding_clarity_title" = "Sabe exactamente dónde estás";
"onboarding_clarity_desc" = "Consulta tu patrimonio total, rendimientos reales y distribución — siempre actualizado.";
"onboarding_habit_title" = "5 minutos al mes son suficientes";
"onboarding_habit_desc" = "Registra tus valores una vez al mes. Portfolio Journal hace los cálculos y muestra tu progreso.";
"onboarding_calm_title" = "Ignora el ruido. Sigue la tendencia.";
"onboarding_calm_desc" = "Las variaciones diarias no cuentan la historia real. Tu crecimiento en meses y años sí.";
"onboarding_goals_title" = "Alcanza tus metas financieras";
"onboarding_goals_desc" = "Define objetivos, sigue los hitos y ve exactamente hasta dónde has llegado.";
// MARK: - Batch Update (1.2.0)
"Batch Update" = "Actualización en bloque";
"Current value" = "Valor actual";
@@ -147,3 +167,11 @@
"New capital added" = "Capital nuevo añadido";
"Contribution (Optional)" = "Aportación (opcional)";
"Track new capital added to separate it from investment growth." = "Registra el capital nuevo para separarlo del crecimiento de la inversión.";
// MARK: - Monthly Highlights (pre-existing gaps)
"Monthly Highlights" = "Aspectos destacados del mes";
"Best Performer" = "Mejor rendimiento";
"Worst Performer" = "Peor rendimiento";
"Best Contributor" = "Mayor aportador";
"Update Check-in" = "Actualizar chequeo";
"Completed %@" = "Completado %@";
+14 -6
View File
@@ -262,10 +262,18 @@ extension IAPService {
]
/// Condensed benefits shown on the paywall (4 max, outcome-focused)
static let paywallBenefits: [(icon: String, title: String, subtitle: String)] = [
("clock.arrow.circlepath", "Your complete history", "Every snapshot, contribution, and gain since day one"),
("chart.bar.xaxis", "Charts that reveal patterns", "Allocation, drawdown, performance — all in one place"),
("wand.and.stars", "12-month forecasts", "See where your portfolio is likely heading"),
("xmark.circle", "No ads, ever", "Clean, focused experience with no distractions")
]
static var paywallBenefits: [(icon: String, title: String, subtitle: String)] {[
("clock.arrow.circlepath",
String(localized: "paywall_benefit_history_title"),
String(localized: "paywall_benefit_history_subtitle")),
("chart.bar.xaxis",
String(localized: "paywall_benefit_charts_title"),
String(localized: "paywall_benefit_charts_subtitle")),
("wand.and.stars",
String(localized: "paywall_benefit_forecasts_title"),
String(localized: "paywall_benefit_forecasts_subtitle")),
("xmark.circle",
String(localized: "paywall_benefit_noads_title"),
String(localized: "paywall_benefit_noads_subtitle"))
]}
}
@@ -15,26 +15,26 @@ struct OnboardingView: View {
private let pages: [OnboardingPage] = [
OnboardingPage(
icon: "chart.line.uptrend.xyaxis",
title: "Know exactly where you stand",
description: "See your total wealth, real returns, and allocation — always up to date.",
title: String(localized: "onboarding_clarity_title"),
description: String(localized: "onboarding_clarity_desc"),
color: .appPrimary
),
OnboardingPage(
icon: "checkmark.circle.fill",
title: "5 minutes a month is enough",
description: "Log your values once a month. Portfolio Journal handles the math and shows your progress.",
title: String(localized: "onboarding_habit_title"),
description: String(localized: "onboarding_habit_desc"),
color: .positiveGreen
),
OnboardingPage(
icon: "leaf.fill",
title: "Ignore the noise. Track the trend.",
description: "Daily swings don't tell the real story. Your growth over months and years does.",
title: String(localized: "onboarding_calm_title"),
description: String(localized: "onboarding_calm_desc"),
color: .appSecondary
),
OnboardingPage(
icon: "flag.checkered",
title: "Reach your financial goals",
description: "Set targets, track milestones, and see exactly how far you've come.",
title: String(localized: "onboarding_goals_title"),
description: String(localized: "onboarding_goals_desc"),
color: .appWarning
)
]