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:
@@ -112,6 +112,16 @@
|
|||||||
"feature_no_ads" = "No Ads";
|
"feature_no_ads" = "No Ads";
|
||||||
"feature_no_ads_desc" = "Ad-free experience forever";
|
"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
|
// MARK: - Settings
|
||||||
"settings_title" = "Settings";
|
"settings_title" = "Settings";
|
||||||
"subscription" = "Subscription";
|
"subscription" = "Subscription";
|
||||||
@@ -177,6 +187,16 @@
|
|||||||
"onboarding_sync_desc" = "Your data syncs automatically via iCloud across all your Apple devices.";
|
"onboarding_sync_desc" = "Your data syncs automatically via iCloud across all your Apple devices.";
|
||||||
"get_started" = "Get Started";
|
"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
|
// MARK: - Errors
|
||||||
"error_generic" = "An error occurred. Please try again.";
|
"error_generic" = "An error occurred. Please try again.";
|
||||||
"error_no_purchases" = "No purchases found to restore";
|
"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";
|
"Unlimited sources, advanced charts & more" = "Fuentes ilimitadas, gráficos avanzados y más";
|
||||||
"See full access" = "Ver acceso completo";
|
"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)
|
// MARK: - Batch Update (1.2.0)
|
||||||
"Batch Update" = "Actualización en bloque";
|
"Batch Update" = "Actualización en bloque";
|
||||||
"Current value" = "Valor actual";
|
"Current value" = "Valor actual";
|
||||||
@@ -147,3 +167,11 @@
|
|||||||
"New capital added" = "Capital nuevo añadido";
|
"New capital added" = "Capital nuevo añadido";
|
||||||
"Contribution (Optional)" = "Aportación (opcional)";
|
"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.";
|
"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 %@";
|
||||||
|
|||||||
@@ -262,10 +262,18 @@ extension IAPService {
|
|||||||
]
|
]
|
||||||
|
|
||||||
/// Condensed benefits shown on the paywall (4 max, outcome-focused)
|
/// Condensed benefits shown on the paywall (4 max, outcome-focused)
|
||||||
static let paywallBenefits: [(icon: String, title: String, subtitle: String)] = [
|
static var paywallBenefits: [(icon: String, title: String, subtitle: String)] {[
|
||||||
("clock.arrow.circlepath", "Your complete history", "Every snapshot, contribution, and gain since day one"),
|
("clock.arrow.circlepath",
|
||||||
("chart.bar.xaxis", "Charts that reveal patterns", "Allocation, drawdown, performance — all in one place"),
|
String(localized: "paywall_benefit_history_title"),
|
||||||
("wand.and.stars", "12-month forecasts", "See where your portfolio is likely heading"),
|
String(localized: "paywall_benefit_history_subtitle")),
|
||||||
("xmark.circle", "No ads, ever", "Clean, focused experience with no distractions")
|
("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] = [
|
private let pages: [OnboardingPage] = [
|
||||||
OnboardingPage(
|
OnboardingPage(
|
||||||
icon: "chart.line.uptrend.xyaxis",
|
icon: "chart.line.uptrend.xyaxis",
|
||||||
title: "Know exactly where you stand",
|
title: String(localized: "onboarding_clarity_title"),
|
||||||
description: "See your total wealth, real returns, and allocation — always up to date.",
|
description: String(localized: "onboarding_clarity_desc"),
|
||||||
color: .appPrimary
|
color: .appPrimary
|
||||||
),
|
),
|
||||||
OnboardingPage(
|
OnboardingPage(
|
||||||
icon: "checkmark.circle.fill",
|
icon: "checkmark.circle.fill",
|
||||||
title: "5 minutes a month is enough",
|
title: String(localized: "onboarding_habit_title"),
|
||||||
description: "Log your values once a month. Portfolio Journal handles the math and shows your progress.",
|
description: String(localized: "onboarding_habit_desc"),
|
||||||
color: .positiveGreen
|
color: .positiveGreen
|
||||||
),
|
),
|
||||||
OnboardingPage(
|
OnboardingPage(
|
||||||
icon: "leaf.fill",
|
icon: "leaf.fill",
|
||||||
title: "Ignore the noise. Track the trend.",
|
title: String(localized: "onboarding_calm_title"),
|
||||||
description: "Daily swings don't tell the real story. Your growth over months and years does.",
|
description: String(localized: "onboarding_calm_desc"),
|
||||||
color: .appSecondary
|
color: .appSecondary
|
||||||
),
|
),
|
||||||
OnboardingPage(
|
OnboardingPage(
|
||||||
icon: "flag.checkered",
|
icon: "flag.checkered",
|
||||||
title: "Reach your financial goals",
|
title: String(localized: "onboarding_goals_title"),
|
||||||
description: "Set targets, track milestones, and see exactly how far you've come.",
|
description: String(localized: "onboarding_goals_desc"),
|
||||||
color: .appWarning
|
color: .appWarning
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user