Release 1.2.1: iCloud sync improvements + ASO multilingual metadata

iCloud sync:
- Force viewContext.refreshAllObjects() on remote change notifications so
  data from other devices is picked up immediately without app restart
- Call refreshFromCloudKit() on foreground to merge any changes made while
  the device was inactive
- Wait up to 10s for initial CloudKit sync on launch before showing onboarding
  (shows "Checking iCloud..." during the wait)
- New OnboardingICloudCheckView: shown on fresh installs with iCloud available,
  lets user restore from iCloud before starting onboarding from scratch

Localization:
- Added de, fr, it, ja, pt-BR lproj folders
- New iCloud onboarding strings in en + es-ES (+ button literals)

ASO metadata (fastlane):
- Updated en-US: new subtitle, keywords, description (fixed "no cloud sync"
  claim), promotional text, release notes
- Added full metadata for es-ES, de-DE, fr-FR, it, ja, pt-BR (63 files total)
- All keyword fields validated ≤100 Unicode chars

Infrastructure:
- Gemfile + Gemfile.lock for fastlane
- Scripts/archive_and_upload_appstore.sh for CI/CD

Version: 1.2.1 (build 7)

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
alexandrev-tibco
2026-03-25 11:54:35 +01:00
parent 7cb5f92cf4
commit 10f6d0ca20
108 changed files with 4069 additions and 238 deletions
@@ -124,6 +124,16 @@
"rating_accessibility" = "Valoración %d de 5";
"achievements_unlocked_count" = "%d de %d desbloqueados";
// MARK: - Satisfaction & Review Dialogs
"checkin_enjoying_dialog_title" = "¿Cuánto disfrutas Portfolio Journal?";
"checkin_enjoying_dialog_message" = "¡Felicidades por tu nuevo logro! Tu opinión nos ayuda a mejorar.";
"not_now" = "Ahora no";
"rating_1_star" = "1 estrella";
"rating_n_stars" = "%d estrellas";
"app_store_review_title" = "¿Te gustaría dejar una reseña en el App Store?";
"app_store_review_message" = "Gracias por las 5 estrellas. Ayuda mucho a que otros inversores descubran la app.";
"write_review" = "Escribir reseña";
// MARK: - Paywall (1.2.0)
"Your full portfolio,\nfully clear" = "Tu cartera completa,\ntotalmente clara";
"One payment. Every feature. Forever." = "Un pago. Todas las funciones. Para siempre.";
@@ -157,10 +167,27 @@
"onboarding_goals_title" = "Alcanza tus metas financieras";
"onboarding_goals_desc" = "Define objetivos, sigue los hitos y ve exactamente hasta dónde has llegado.";
// iCloud check antes del onboarding (1.2.1)
"icloud_check_title" = "¿Ya usas Portfolio Journal?";
"icloud_check_description" = "Si tienes datos en otro dispositivo, activa iCloud para restaurarlos aquí.";
"icloud_enabled_title" = "iCloud activado";
"icloud_enabled_description" = "Cierra la app y ábrela de nuevo. Tus datos se cargarán automáticamente desde iCloud.";
"checking_icloud" = "Comprobando iCloud...";
// Literales de botones (SwiftUI auto-lookup)
"Restore from iCloud" = "Restaurar desde iCloud";
"Start Fresh" = "Empezar desde cero";
"Got it" = "Entendido";
// MARK: - Batch Update (1.2.0)
"Batch Update" = "Actualización en bloque";
"Current value" = "Valor actual";
"Contribution this period (optional)" = "Aportación en este periodo (opcional)";
"save_1_snapshot" = "Guardar 1 snapshot";
"save_n_snapshots" = "Guardar %d snapshots";
// MARK: - Monthly Check-in Card
"checkin_update_month" = "Actualizar %@";
"checkin_start_new" = "Iniciar";
// MARK: - Contribution (1.2.0)
"Include Contribution" = "Incluir aportación";