kasy-cli 1.13.0 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/kasy.js +140 -12
- package/lib/commands/add.js +2 -2
- package/lib/commands/codemagic.js +11 -4
- package/lib/commands/deploy.js +3 -3
- package/lib/commands/favicon.js +115 -0
- package/lib/commands/icon.js +143 -0
- package/lib/commands/ios.js +28 -7
- package/lib/commands/new.js +8 -20
- package/lib/commands/remove.js +1 -1
- package/lib/commands/reset.js +385 -0
- package/lib/commands/run.js +24 -17
- package/lib/commands/splash.js +14 -4
- package/lib/commands/update.js +1 -1
- package/lib/scaffold/backends/api/patch/README.md +1 -1
- package/lib/scaffold/backends/api/patch/android/app/src/main/AndroidManifest.xml +1 -1
- package/lib/scaffold/backends/api/patch/lib/features/notifications/api/device_api.dart +53 -0
- package/lib/scaffold/backends/api/pubspec.yaml.tpl +11 -1
- package/lib/scaffold/backends/firebase/tokens.js +2 -2
- package/lib/scaffold/backends/supabase/edge-functions/send-push-notification/index.ts +8 -2
- package/lib/scaffold/backends/supabase/migrations/20240101000011_dedupe_device_tokens.sql +34 -0
- package/lib/scaffold/backends/supabase/patch/README.md +1 -1
- package/lib/scaffold/backends/supabase/patch/android/app/src/main/AndroidManifest.xml +1 -1
- package/lib/scaffold/backends/supabase/patch/lib/features/notifications/api/device_api.dart +43 -0
- package/lib/scaffold/backends/supabase/pubspec.yaml.tpl +11 -1
- package/lib/utils/apple-release.js +115 -16
- package/lib/utils/checks.js +45 -107
- package/lib/utils/debug.js +75 -0
- package/lib/utils/flutter-run.js +173 -0
- package/lib/utils/friendly-error.js +91 -0
- package/lib/utils/i18n/messages-en.js +970 -0
- package/lib/utils/i18n/messages-es.js +968 -0
- package/lib/utils/i18n/messages-pt.js +968 -0
- package/lib/utils/i18n.js +21 -2483
- package/lib/utils/mobile-identity.js +35 -0
- package/lib/utils/png-padding.js +120 -0
- package/lib/utils/ui.js +114 -0
- package/package.json +8 -4
- package/templates/firebase/README.en.md +1 -1
- package/templates/firebase/README.es.md +1 -1
- package/templates/firebase/README.md +1 -1
- package/templates/firebase/android/app/build.gradle.kts +10 -1
- package/templates/firebase/android/app/src/main/AndroidManifest.xml +1 -1
- package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MainActivity.kt +25 -1
- package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MyWidget.kt +161 -11
- package/templates/firebase/android/app/src/main/res/drawable/widget_add_button.xml +15 -0
- package/templates/firebase/android/app/src/main/res/drawable/widget_gradient_bg.xml +9 -0
- package/templates/firebase/android/app/src/main/res/drawable/widget_gradient_inner.xml +12 -0
- package/templates/firebase/android/app/src/main/res/drawable/widget_plan_pill_bg.xml +5 -0
- package/templates/firebase/android/app/src/main/res/drawable/widget_preview_image.xml +17 -0
- package/templates/firebase/android/app/src/main/res/drawable/widget_pro_pill_bg.xml +5 -0
- package/templates/firebase/android/app/src/main/res/drawable-hdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-mdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-mdpi/ic_launcher_background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-hdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-mdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png +0 -0
- package/templates/firebase/android/app/src/main/res/layout/widget_loading.xml +8 -0
- package/templates/firebase/android/app/src/main/res/layout/widget_preview.xml +53 -0
- package/templates/firebase/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +9 -0
- package/templates/firebase/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/xml/mywidget_info.xml +9 -3
- package/templates/firebase/assets/images/favicon.png +0 -0
- package/templates/firebase/assets/images/icon.png +0 -0
- package/templates/firebase/assets/images/icon_android.png +0 -0
- package/templates/firebase/assets/images/icon_foreground_empty.png +0 -0
- package/templates/firebase/assets/images/splash_logo_dark_android12.png +0 -0
- package/templates/firebase/assets/images/splash_logo_light_android12.png +0 -0
- package/templates/firebase/firestore.indexes.json +10 -0
- package/templates/firebase/functions/src/core/data/entities/user_device_entity.ts +3 -0
- package/templates/firebase/functions/src/core/data/repositories/user_device_repository.ts +17 -1
- package/templates/firebase/functions/src/index.ts +1 -0
- package/templates/firebase/functions/src/notifications/device_triggers.ts +58 -0
- package/templates/firebase/ios/HomeWidgetExtension/MyWidget.swift +116 -33
- package/templates/firebase/ios/Runner/AppDelegate.swift +17 -1
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png +0 -0
- package/templates/firebase/ios/Runner/Info.plist +2 -2
- package/templates/firebase/ios/Runner/es.lproj/InfoPlist.strings +1 -1
- package/templates/firebase/ios/Runner/pt-BR.lproj/InfoPlist.strings +1 -1
- package/templates/firebase/ios/Runner/pt.lproj/InfoPlist.strings +1 -1
- package/templates/firebase/lib/components/components.dart +1 -0
- package/templates/firebase/lib/components/kasy_avatar.dart +88 -57
- package/templates/firebase/lib/components/kasy_avatar_presets.dart +116 -74
- package/templates/firebase/lib/components/kasy_button.dart +8 -0
- package/templates/firebase/lib/components/kasy_tabs.dart +431 -0
- package/templates/firebase/lib/core/bottom_menu/kasy_bottom_bar_factory.dart +18 -0
- package/templates/firebase/lib/core/home_widgets/home_widget_mywidget_service.dart +73 -19
- package/templates/firebase/lib/core/home_widgets/home_widget_service.dart +22 -8
- package/templates/firebase/lib/core/shared_preferences/shared_preferences.dart +16 -4
- package/templates/firebase/lib/core/states/components/maybeshow_component.dart +4 -8
- package/templates/firebase/lib/core/states/user_state_notifier.dart +13 -1
- package/templates/firebase/lib/features/home/home_components_page.dart +1 -1
- package/templates/firebase/lib/features/home/home_components_preview_registry.dart +316 -93
- package/templates/firebase/lib/features/home/home_page.dart +0 -6
- package/templates/firebase/lib/features/notifications/api/device_api.dart +57 -0
- package/templates/firebase/lib/features/notifications/providers/models/notification.dart +11 -1
- package/templates/firebase/lib/features/notifications/repositories/device_repository.dart +9 -0
- package/templates/firebase/lib/features/notifications/repositories/notifications_repository.dart +1 -4
- package/templates/firebase/lib/features/notifications/shared/att_permission.dart +28 -8
- package/templates/firebase/lib/features/notifications/ui/notifications_page.dart +16 -1
- package/templates/firebase/lib/features/notifications/ui/widgets/empty_notifications.dart +44 -11
- package/templates/firebase/lib/features/settings/ui/components/admin/admin_bottom_sheet.dart +31 -29
- package/templates/firebase/lib/features/settings/ui/components/language_switcher.dart +21 -5
- package/templates/firebase/lib/i18n/en.i18n.json +4 -1
- package/templates/firebase/lib/i18n/es.i18n.json +4 -1
- package/templates/firebase/lib/i18n/pt.i18n.json +4 -1
- package/templates/firebase/pubspec.yaml +10 -3
- package/templates/firebase/test/features/notifications/data/device_api_fake.dart +9 -0
- package/templates/firebase/web/favicon.png +0 -0
- package/templates/firebase/web/icons/Icon-192.png +0 -0
- package/templates/firebase/web/icons/Icon-512.png +0 -0
- package/templates/firebase/web/icons/Icon-maskable-192.png +0 -0
- package/templates/firebase/web/icons/Icon-maskable-512.png +0 -0
- package/templates/firebase/web/index.html +9 -0
- package/templates/firebase/web/manifest.json +3 -3
- package/templates/firebase/assets/images/app_icon.png +0 -0
- package/templates/firebase/assets/images/onboarding/img1.jpg +0 -0
- package/templates/firebase/assets/images/onboarding/onboarding.png +0 -0
- package/templates/firebase/lib/core/states/components/maybe_ask_biometric_setup.dart +0 -88
- package/templates/firebase/lib/features/notifications/shared/notification_permission_bottom_sheet.dart +0 -144
|
@@ -0,0 +1,968 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Kasy CLI i18n messages — Español.
|
|
5
|
+
*
|
|
6
|
+
* One entry per user-facing string. Keys are dotted paths describing
|
|
7
|
+
* where the string is used (cli.help.*, run.*, ios.*, etc.).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
module.exports = {
|
|
11
|
+
'cli.tagline': 'Crea apps móviles sin dolor de configuración',
|
|
12
|
+
'cli.description': 'Crea apps Flutter sin dolor de configuración.',
|
|
13
|
+
'cli.usage': '<comando> [argumentos]',
|
|
14
|
+
'cli.option.version': 'Mostrar versión instalada',
|
|
15
|
+
'cli.option.lang': 'Idioma (en, pt, es)',
|
|
16
|
+
'cli.help.afterError': '(ejecuta con --help para detalles de uso)',
|
|
17
|
+
'cli.help.more': 'Ejecuta "{command}" para detalles de un comando específico.',
|
|
18
|
+
'cli.help.quickStart': 'Crear un nuevo app:',
|
|
19
|
+
'cli.help.optionDescription': 'Mostrar ayuda del comando',
|
|
20
|
+
'cli.help.commandDescription': 'Mostrar ayuda del comando',
|
|
21
|
+
'cli.help.inline.options': '[opciones]',
|
|
22
|
+
'cli.help.heading.usage': 'Uso',
|
|
23
|
+
'cli.help.heading.arguments': 'Argumentos',
|
|
24
|
+
'cli.help.heading.options': 'Opciones',
|
|
25
|
+
'cli.help.heading.globalOptions': 'Opciones globales',
|
|
26
|
+
'cli.help.heading.commands': 'Comandos',
|
|
27
|
+
'cli.help.group.start': 'Para empezar',
|
|
28
|
+
'cli.help.group.work': 'Trabajar en tu app',
|
|
29
|
+
'cli.help.group.publish': 'Publicar y probar',
|
|
30
|
+
'cli.help.group.maintenance': 'Mantenimiento de Kasy CLI',
|
|
31
|
+
'cli.help.group.advanced': 'Avanzado',
|
|
32
|
+
'cli.help.group.other': 'Otros',
|
|
33
|
+
'cli.help.tip': 'Tip: ejecuta `kasy <comando> --help` para más detalles. Usa --lang pt|en|es para cambiar idioma.',
|
|
34
|
+
'cli.command.setup.description': '(avanzado) Configura un proyecto Flutter existente',
|
|
35
|
+
'cli.command.new.description': 'Crea una app nueva (ej: kasy new mi-app)',
|
|
36
|
+
'cli.command.new.projectName': 'nombre del proyecto',
|
|
37
|
+
'cli.command.new.projectNameArg': 'Nombre de la carpeta del proyecto',
|
|
38
|
+
'prompt.projectName.enter': '¿Cuál es el nombre de tu proyecto?',
|
|
39
|
+
'prompt.projectName.required': 'El nombre del proyecto es obligatorio.',
|
|
40
|
+
'prompt.projectName.default': 'mi_app',
|
|
41
|
+
'cli.command.setup.directoryName': 'directorio',
|
|
42
|
+
'cli.command.setup.directoryArg': 'Directorio destino (por defecto: carpeta actual .)',
|
|
43
|
+
'cli.command.setup.langName': 'idioma',
|
|
44
|
+
'cli.command.setup.langOption': 'Idioma de prompts (en, pt, es)',
|
|
45
|
+
'cli.command.setup.backendOption': 'Adapter de backend (firebase, supabase, api)',
|
|
46
|
+
'cli.command.setup.featuresOption': 'Features opcionales separadas por coma (web,widget,llm_chat,revenuecat,ci)',
|
|
47
|
+
'cli.command.help.paramName': 'comando',
|
|
48
|
+
'cli.command.doctor.description': 'Verifica si tu computadora está lista para correr Kasy',
|
|
49
|
+
'cli.command.modules.description': 'Muestra lo que viene incluido y lo que puedes añadir',
|
|
50
|
+
'cli.command.validate.description': '(avanzado) Valida combinaciones de backend y features',
|
|
51
|
+
'cli.command.validate.analyzeOnlyOption': 'Ejecuta solo flutter analyze (sin build)',
|
|
52
|
+
'cli.command.version.description': 'Muestra la versión instalada de Kasy',
|
|
53
|
+
'cli.command.upgrade.description': 'Actualiza la Kasy CLI a la última versión',
|
|
54
|
+
'cli.command.uninstall.description': 'Desinstala Kasy de esta computadora',
|
|
55
|
+
'cli.command.upgrade.running': 'Actualizando la CLI kasy...',
|
|
56
|
+
'cli.command.upgrade.done': 'kasy actualizado correctamente!',
|
|
57
|
+
'cli.command.uninstall.running': 'Desinstalando la CLI kasy...',
|
|
58
|
+
'cli.command.uninstall.done': 'kasy desinstalado. Hasta luego!',
|
|
59
|
+
'new.checks.environment': 'Verificaciones de entorno',
|
|
60
|
+
'new.checks.environment.checking': 'Verificando entorno',
|
|
61
|
+
'new.checks.environment.done': 'Entorno listo',
|
|
62
|
+
'setup.checks.backend.checking': 'Verificando herramientas {backend}',
|
|
63
|
+
'setup.checks.backend.done': 'Herramientas {backend} listas',
|
|
64
|
+
'new.checks.firebaseForPush': 'Nota: Firebase CLI es obligatorio para notificaciones push (Firebase Cloud Messaging / FCM) en todos los backends.',
|
|
65
|
+
'new.checks.requiredBlock': 'Faltan herramientas obligatorias. Instalalas para continuar.',
|
|
66
|
+
'new.checks.installFirebase': 'Firebase: npm i -g firebase-tools && firebase login. FlutterFire: dart pub global activate flutterfire_cli',
|
|
67
|
+
'new.checks.installSupabase': 'Supabase: npm i -g supabase (o brew install supabase/tap/supabase) && supabase login',
|
|
68
|
+
'new.checks.installSupabase.darwin': 'Supabase: brew install supabase/tap/supabase && supabase login (o npm i -g supabase)',
|
|
69
|
+
'new.checks.installSupabase.win32': 'Supabase: npm i -g supabase && supabase login',
|
|
70
|
+
'new.checks.installSupabase.linux': 'Supabase: npm i -g supabase && supabase login',
|
|
71
|
+
'setup.checks.environment': 'Verificaciones de entorno',
|
|
72
|
+
'setup.checks.prepareFirebase': 'Herramientas Firebase (push, remote config)',
|
|
73
|
+
'setup.checks.backend': 'Verificaciones de backend ({backend})',
|
|
74
|
+
'setup.firebase.installing': 'Instalando Firebase CLI...',
|
|
75
|
+
'setup.supabase.installing': 'Instalando Supabase CLI...',
|
|
76
|
+
'setup.flutterfire.installing': 'Instalando FlutterFire CLI...',
|
|
77
|
+
'setup.warn.hang': 'Si se cuelga, ejecuta manualmente: flutterfire --versión',
|
|
78
|
+
'setup.warn.supabase': '¿Usas Supabase o API propia? Firebase sigue siendo útil para push y remote config.',
|
|
79
|
+
'doctor.title': 'Kasy Doctor',
|
|
80
|
+
'doctor.baseEnvironment': 'Entorno base',
|
|
81
|
+
'doctor.optionalBackend': 'Herramientas opcionales de backend',
|
|
82
|
+
'doctor.requiredMissing': 'Faltan dependencias obligatorias. Corrige los errores anteriores y ejecuta doctor nuevamente.',
|
|
83
|
+
'doctor.requiredPassed': '✓ Verificaciones obligatorias de entorno aprobadas.',
|
|
84
|
+
'modules.backends': 'Backends disponibles:',
|
|
85
|
+
'modules.featuresBase': 'Siempre incluido:',
|
|
86
|
+
'modules.features': 'Features opcionales:',
|
|
87
|
+
'modules.tag.firebaseOnly': 'solo Firebase',
|
|
88
|
+
'modules.tag.requiresDb': 'requiere Firebase o Supabase',
|
|
89
|
+
'modules.tag.enhances': 'activa {target}',
|
|
90
|
+
'modules.hint.subscriptionNoRc': 'Tip: la pantalla de Subscriptions está incluida pero inactiva. Ejecuta `kasy add revenuecat` para habilitar pagos reales.',
|
|
91
|
+
'modules.feature.base.authentication.description': 'Registro, inicio de sesión y gestión de cuenta',
|
|
92
|
+
'modules.feature.base.home.description': 'Pantalla principal de la app después del login',
|
|
93
|
+
'modules.feature.base.settings.description': 'Tema, idioma, cuenta y preferencias',
|
|
94
|
+
'modules.feature.base.notifications.description': 'Notificaciones push via Firebase Cloud Messaging (funciona con cualquier backend)',
|
|
95
|
+
'modules.feature.base.subscription.description': 'Pantalla y modelo de suscripcion premium (anade RevenueCat para habilitar pagos reales)',
|
|
96
|
+
'modules.backend.firebase.description': 'Adapter de backend Firebase',
|
|
97
|
+
'modules.backend.supabase.description': 'Adapter de backend Supabase',
|
|
98
|
+
'modules.backend.api.description': 'Adapter de backend API REST/GraphQL',
|
|
99
|
+
'modules.feature.sentry.description': 'Seguimiento de errores y crashes con Sentry',
|
|
100
|
+
'modules.feature.analytics.description': 'Seguimiento de eventos de analytics (Firebase Analytics)',
|
|
101
|
+
'modules.feature.facebook.description': 'Login de Facebook y seguimiento de eventos Meta Ads (siempre juntos)',
|
|
102
|
+
'modules.feature.revenuecat.description': 'Habilita pagos reales en la pantalla de Subscriptions',
|
|
103
|
+
'modules.feature.onboarding.description': 'Flujo de bienvenida mostrado en el primer acceso',
|
|
104
|
+
'modules.feature.web.description': 'Soporte Web/PWA',
|
|
105
|
+
'modules.feature.widget.description': 'Widget de pantalla inicial iOS/Android',
|
|
106
|
+
'modules.feature.llm_chat.description': 'Pantalla de chat con IA usando OpenAI o Gemini',
|
|
107
|
+
'modules.feature.feedback.description': 'Solicitudes y votacion de features dentro de la app',
|
|
108
|
+
'modules.feature.local_notifications.description': 'Recordatorios locales programados por el usuario (sin servidor)',
|
|
109
|
+
'modules.feature.ci.description': 'CI/CD: GitHub/GitLab (tests + build) + Codemagic (publicación en tiendas)',
|
|
110
|
+
'checks.checking': 'Verificando {name}...',
|
|
111
|
+
'checks.found': '{name} encontrado',
|
|
112
|
+
'checks.foundWithVersion': '{name} listo ({versión})',
|
|
113
|
+
'checks.missing': '{name} ausente',
|
|
114
|
+
'checks.notFound': '{name} no encontrado',
|
|
115
|
+
'checks.notFound.short': 'no encontrado',
|
|
116
|
+
'checks.runHint': 'Ejecuta',
|
|
117
|
+
'checks.stillMissing': 'aún no detectado',
|
|
118
|
+
'checks.flutter.warn': 'Flutter SDK no encontrado. Instala Flutter para compilar y ejecutar apps: https://docs.flutter.dev/get-started/install',
|
|
119
|
+
'checks.install.failed': 'instalación automática falló — ejecuta el comando manualmente',
|
|
120
|
+
'checks.waitPrompt.gcloud.install': 'Tras instalar gcloud, presiona Enter para verificar de nuevo',
|
|
121
|
+
'checks.waitPrompt.gcloud.auth': 'Tras ejecutar gcloud auth login, presiona Enter para verificar de nuevo',
|
|
122
|
+
'error.hint.notFlutterProject': 'No estás dentro de un proyecto Flutter. Usa `kasy new` para crear uno, o entra en la carpeta de un proyecto existente.',
|
|
123
|
+
'error.hint.flutterMissing': 'Flutter no está instalado o no está en el PATH. Ejecuta `kasy doctor` para diagnosticar.',
|
|
124
|
+
'error.hint.permission': 'Un archivo/carpeta es de solo lectura. Verifica los permisos de la carpeta padre o intenta desde tu carpeta home.',
|
|
125
|
+
'error.hint.noSpace': 'Disco lleno. Libera espacio (builds Flutter/Xcode necesitan 5-15 GB) e intenta de nuevo.',
|
|
126
|
+
'error.hint.network': 'Problema de red — verifica tu conexión a internet e intenta de nuevo.',
|
|
127
|
+
'error.hint.firebaseLogin': 'No estás autenticado en Firebase. Ejecuta: firebase login',
|
|
128
|
+
'error.hint.supabaseLogin': 'No estás autenticado en Supabase. Ejecuta: supabase login',
|
|
129
|
+
'error.hint.gcloudAuth': 'Necesitas autenticarte con gcloud. Ejecuta: gcloud auth login',
|
|
130
|
+
'error.hint.flutterRunFailed': 'Flutter no pudo ejecutar la app. Intenta de nuevo con --verbose para ver la salida completa.',
|
|
131
|
+
'checks.diagnostic.xcodeLicense': '{name} está instalado, pero Xcode necesita que aceptes la licencia. Ejecuta: sudo xcodebuild -license',
|
|
132
|
+
'checks.diagnostic.xcodeCli': '{name} está instalado, pero faltan las Command Line Tools de Xcode. Ejecuta: xcode-select --install',
|
|
133
|
+
'banner.title': 'Kasy CLI · Generador Flutter SaaS',
|
|
134
|
+
'welcome.firstRun': '¡Bienvenido a Kasy CLI!',
|
|
135
|
+
'welcome.chooseLanguage': 'Primero, elige tu idioma:',
|
|
136
|
+
'prompt.language.select': 'Elige tu idioma',
|
|
137
|
+
'prompt.cancelled': 'Comando cancelado por el usuario.',
|
|
138
|
+
'license.required': '🔑 Se requiere clave de activación para usar Kasy CLI',
|
|
139
|
+
'license.checking': 'Validando clave de activación...',
|
|
140
|
+
'license.saved': '✅ Clave validada correctamente',
|
|
141
|
+
'license.invalid': 'Clave inválida. Verifica tu clave o contacta soporte en kasy.dev.',
|
|
142
|
+
'license.expired': '❌ Tu suscripción ha expirado. Renueva en kasy.dev.',
|
|
143
|
+
'license.inactive': '❌ Tu clave fue desactivada. Contacta soporte en kasy.dev.',
|
|
144
|
+
'license.offlineWarning': '⚠️ No se pudo conectar al servidor — continuando sin conexión.',
|
|
145
|
+
'license.subscriptionExpired': '❌ Tu suscripcion expiró. Las actualizaciones requieren plan activo. Renueva en kasy.dev.\n Tus proyectos siguen funcionando — solo las actualizaciones están bloqueadas.',
|
|
146
|
+
'prompt.license.enter': '👉 Ingresa tu clave de activación (XXXX-XXXX-XXXX-XXXX)',
|
|
147
|
+
'prompt.license.invalid': 'Formato inválido. Usa XXXX-XXXX-XXXX-XXXX.',
|
|
148
|
+
'prompt.appName.enter': 'Ingresa el nombre de tu app',
|
|
149
|
+
'prompt.appName.required': 'El nombre de la app es obligatorio.',
|
|
150
|
+
'prompt.bundleId.enter': 'Ingresa el bundle ID (com.company.app)',
|
|
151
|
+
'prompt.bundleId.required': 'El bundle ID es obligatorio.',
|
|
152
|
+
'prompt.bundleId.invalid': 'El bundle ID debe verse como com.company.app.',
|
|
153
|
+
'prompt.backend.select': 'Elige el proveedor de backend',
|
|
154
|
+
'prompt.features.select': 'Elige las features opcionales a incluir',
|
|
155
|
+
'prompt.features.instructions': 'Espacio para marcar, enter para confirmar',
|
|
156
|
+
'prompt.multiselect.instructions': '\nInstrucciones:\n ↑/↓: Resaltar opción\n ←/→/[space]: Marcar/desmarcar\n a: Marcar/desmarcar todos\n enter/return: Confirmar',
|
|
157
|
+
'prompt.multiselect.warnDisabled': 'Usa ↓ para ir a una opción seleccionable, Space para marcar, Enter para confirmar',
|
|
158
|
+
'prompt.firebase.projectId.enter': 'Ingresa el Firebase Project ID',
|
|
159
|
+
'prompt.firebase.projectId.required': 'Firebase Project ID es obligatorio.',
|
|
160
|
+
'prompt.supabase.url.enter': 'Ingresa la URL de Supabase',
|
|
161
|
+
'prompt.supabase.url.required': 'La URL de Supabase es obligatoria.',
|
|
162
|
+
'prompt.supabase.anonKey.enter': 'Ingresa la clave anon de Supabase',
|
|
163
|
+
'prompt.supabase.anonKey.required': 'La clave anon de Supabase es obligatoria.',
|
|
164
|
+
'new.supabase.q.create': '¿Crear nuevo proyecto Supabase o usar existente?',
|
|
165
|
+
'new.supabase.q.create.create': '✨ Crear nuevo proyecto (recomendado para principiantes)',
|
|
166
|
+
'new.supabase.q.create.existing': '📂 Usar proyecto existente',
|
|
167
|
+
'new.firebase.q.setupMode': '¿Cómo quieres configurar Firebase?',
|
|
168
|
+
'new.firebase.q.setupMode.push': 'Proyecto Firebase para notificaciones push (FCM):',
|
|
169
|
+
'new.firebase.q.setupMode.push.explain': 'Las notificaciones push (FCM) requieren un proyecto Firebase, incluso cuando tu backend principal es Supabase o API REST.',
|
|
170
|
+
'new.firebase.q.setupMode.create': '✨ Crear desde cero (recomendado para principiantes)',
|
|
171
|
+
'new.firebase.q.setupMode.existing': '📂 Usar proyecto existente',
|
|
172
|
+
'new.firebase.q.region': '¿Dónde están la mayoría de los usuarios de tu app?',
|
|
173
|
+
'new.firebase.q.region.brazil': '🇧🇷 Brasil (São Paulo) — southamerica-east1',
|
|
174
|
+
'new.firebase.q.region.us': '🇺🇸 Estados Unidos — us-central1',
|
|
175
|
+
'new.firebase.q.region.europe': '🇪🇺 Europa — europe-west1',
|
|
176
|
+
'new.firebase.q.region.global': '🌍 Global / No sé — us-central1',
|
|
177
|
+
'new.firebase.create.prereq': 'Necesitas: gcloud CLI (cloud.google.com/sdk) + gcloud auth login. Plan Blaze necesario para deploy.',
|
|
178
|
+
'new.firebase.create.creating': 'Creando proyecto Firebase…',
|
|
179
|
+
'new.firebase.create.includeWeb': '¿Incluir app Web en Firebase? (para plataforma web)',
|
|
180
|
+
'new.firebase.create.nowDo': 'Ahora activa la autenticación (antes de ejecutar el app):',
|
|
181
|
+
'new.firebase.create.activateEmail': 'Activa Email/Contraseña: Firebase Console → Authentication → Sign-in method',
|
|
182
|
+
'new.firebase.create.activateGoogle': 'Activa Google: misma página, clic en Google → Activar',
|
|
183
|
+
'new.firebase.create.beforeContinue.title': 'Antes de continuar, activa en Firebase Console:',
|
|
184
|
+
'new.firebase.create.beforeContinue.step1': '1. Authentication → Sign-in method → Google (Email/Contraseña y Anónimo ya fueron activados automáticamente)',
|
|
185
|
+
'new.firebase.create.beforeContinue.step1.noAuth': '1. Authentication → Sign-in method → activa Email/Contraseña, Anónimo y Google',
|
|
186
|
+
'new.firebase.create.beforeContinue.ready': 'He activado Google Sign-In. ¿Continuar?',
|
|
187
|
+
'new.firebase.create.beforeContinue.ready.noAuth': 'He activado Email/Contraseña, Anónimo y Google Sign-In. ¿Continuar?',
|
|
188
|
+
'new.firebase.create.beforeContinue.secretManagerAuto': '(Secret Manager y Storage ya fueron activados automáticamente)',
|
|
189
|
+
'new.firebase.create.sha1Skipped': 'SHA-1 no añadido',
|
|
190
|
+
'new.firebase.create.sha1ManualInstruction': 'Añade el SHA-1 manualmente: Firebase Console → Configuración del proyecto → Tus apps → Android → Añadir huella digital',
|
|
191
|
+
'new.firebase.create.sha1ParseError': 'No se pudo extraer el SHA-1 de la salida de keytool',
|
|
192
|
+
'new.firebase.create.sha1ErrorDetail': 'Motivo',
|
|
193
|
+
'new.firebase.create.useExistingHint': 'El proyecto puede haberse creado. Prueba "Usar proyecto existente" con ID: {id}',
|
|
194
|
+
'new.firebase.create.usingProjectId': 'Usando project ID: {id} (continuando con proyecto existente)',
|
|
195
|
+
'new.firebase.create.waitPropagate': 'Esperando propagación del proyecto (20s)…',
|
|
196
|
+
'new.firebase.create.success': 'Proyecto Firebase creado correctamente.',
|
|
197
|
+
'new.firebase.create.failed': 'No se pudo crear el proyecto',
|
|
198
|
+
'new.firebase.create.gcloudRequired': 'gcloud CLI es obligatorio para "crear desde cero". Sin él, el flujo completo de Firebase no puede ejecutarse.',
|
|
199
|
+
'new.firebase.create.installTitle': 'Para instalar gcloud CLI, ejecuta:',
|
|
200
|
+
'new.firebase.create.installCommand': 'Comando',
|
|
201
|
+
'new.firebase.create.installAfter': 'Luego inicia sesión',
|
|
202
|
+
'new.firebase.create.installUrl': 'O descarga en',
|
|
203
|
+
'new.firebase.create.authCommand': 'Ejecuta: gcloud auth login',
|
|
204
|
+
'new.firebase.create.fallbackHint': 'Por ahora, ingresa un Firebase Project ID existente para continuar (o instala gcloud y ejecuta de nuevo):',
|
|
205
|
+
'new.firebase.q.billingAccount': '¿Qué cuenta de facturación vincular al proyecto?',
|
|
206
|
+
'new.firebase.q.billingAccount.hint': 'Elige la cuenta con cuota disponible (hasta 3 proyectos por cuenta)',
|
|
207
|
+
'new.firebase.q.billingAccount.context': 'Límite: hasta 3 proyectos por cuenta de facturación. Elige una con cuota disponible (elimina proyectos no usados en console.cloud.google.com/billing si hace falta).',
|
|
208
|
+
'new.firebase.q.billingAccount.other': 'Otra — introducir ID de cuenta manualmente',
|
|
209
|
+
'new.firebase.q.billingAccount.manualId': 'ID de cuenta de facturación (ej: 018A70-7D0548-0F84A8)',
|
|
210
|
+
'new.firebase.q.billingAccount.manualId.hint': 'Encuéntralo en console.cloud.google.com/billing',
|
|
211
|
+
'new.firebase.q.billingAccount.manualId.required': 'El ID de la cuenta de facturación es obligatorio.',
|
|
212
|
+
'new.firebase.q.organization': '¿En qué organización GCP crear el proyecto?',
|
|
213
|
+
'new.firebase.q.organization.none': 'Sin organización (cuenta personal / proyecto independiente)',
|
|
214
|
+
'new.firebase.q.organization.hint': 'Organizaciones vinculadas a tu cuenta gcloud',
|
|
215
|
+
'new.firebase.create.billingRetry.title': 'Vincula la facturación manualmente (cuota excedida o error de billing):',
|
|
216
|
+
'new.firebase.create.billingRetry.hint': 'Consejo: El límite es 3 proyectos por cuenta de facturación. Elimina proyectos no usados en el enlace de arriba. Si acabas de eliminar uno, espera 2–5 min a que se propague el cambio y reintenta.',
|
|
217
|
+
'new.firebase.create.billingRetry.ready': 'He vinculado la facturación. ¿Reintentar?',
|
|
218
|
+
'new.firebase.create.billingRetry.retrying': 'Reintentando…',
|
|
219
|
+
'new.firebase.create.billingRetry.exit': 'Ejecuta de nuevo con "Usar proyecto existente" después de vincular la facturación.',
|
|
220
|
+
'new.firebase.create.projectQuotaExceeded': 'Cuota de proyectos excedida. Elimina proyectos no usados en console.cloud.google.com o ingresa un proyecto existente abajo.',
|
|
221
|
+
'new.firebase.create.creatingPush': 'Creando proyecto Firebase para notificaciones push…',
|
|
222
|
+
'new.firebase.create.successPush': 'Proyecto Firebase creado para FCM + Remote Config.',
|
|
223
|
+
'new.supabase.q.orgSelect': '¿En qué organización crear el proyecto?',
|
|
224
|
+
'new.supabase.orgsRequired': 'No se encontraron organizaciones. Ejecuta supabase login e intenta de nuevo.',
|
|
225
|
+
'new.supabase.q.region': '¿Dónde están la mayoría de los usuarios de tu app?',
|
|
226
|
+
'new.supabase.q.region.brazil': '🇧🇷 Brasil (São Paulo) — sa-east-1',
|
|
227
|
+
'new.supabase.q.region.us': '🇺🇸 Estados Unidos (Virginia) — us-east-1',
|
|
228
|
+
'new.supabase.q.region.europe': '🇪🇺 Europa (Irlanda) — eu-west-1',
|
|
229
|
+
'new.supabase.q.region.global': '🌍 Global / No sé — us-east-1',
|
|
230
|
+
'new.supabase.q.dbPassword': 'Contraseña del banco (mín 6 caracteres)',
|
|
231
|
+
'new.supabase.q.dbPassword.required': 'La contraseña debe tener al menos 6 caracteres.',
|
|
232
|
+
'new.supabase.creating': 'Creando proyecto en Supabase…',
|
|
233
|
+
'new.supabase.created': 'Proyecto creado correctamente.',
|
|
234
|
+
'new.supabase.createFailed': 'No se pudo crear el proyecto',
|
|
235
|
+
'new.supabase.loginHint': 'Ejecuta: supabase login. Luego ingresa la URL y clave de tu proyecto existente.',
|
|
236
|
+
'new.supabase.setup': 'Vinculando proyecto y desplegando…',
|
|
237
|
+
'new.supabase.setupManual': 'Ejecuta manualmente: supabase link, supabase db push, supabase functions deploy',
|
|
238
|
+
'new.supabase.q.useExisting.orgSelect': '¿En qué organización está el proyecto?',
|
|
239
|
+
'new.supabase.q.useExisting.projectSelect': '¿Qué proyecto Supabase existente quieres usar?',
|
|
240
|
+
'new.supabase.projectsRequired': 'No se encontraron proyectos en esta organización.',
|
|
241
|
+
'new.supabase.q.dbPassword.existing': 'Contraseña del banco del proyecto (necesaria para vincular y aplicar migraciones)',
|
|
242
|
+
'new.supabase.existingLinked': 'Proyecto listo para vincular y aplicar migraciones.',
|
|
243
|
+
'setup.license.loaded': '✓ Clave de licencia cargada desde la configuración local.',
|
|
244
|
+
'setup.license.saved': '✓ Clave de licencia validada y guardada.',
|
|
245
|
+
'setup.license.invalid': 'Formato de licencia inválido. Se espera XXXX-XXXX-XXXX-XXXX.',
|
|
246
|
+
'setup.error.targetNotEmpty': 'El directorio de destino no está vacío: {path}',
|
|
247
|
+
'setup.error.targetExists': 'El directorio de destino ya existe: {path}',
|
|
248
|
+
'setup.error.coreMissing': 'No se encontro la carpeta del core template: {path}',
|
|
249
|
+
'setup.error.requiredChecksFailed': 'Fallo en verificaciones obligatorias. Ejecuta `kasy doctor`.',
|
|
250
|
+
'setup.error.generatingFailed': 'Error al generar el proyecto.',
|
|
251
|
+
'setup.error.conflictHint': 'Consejo: Elimina la carpeta del proyecto y ejecuta de nuevo, o usa un directorio vacío.',
|
|
252
|
+
'setup.spinner.generating': 'Generando archivos del proyecto...',
|
|
253
|
+
'setup.success.created': 'Proyecto creado correctamente.',
|
|
254
|
+
'setup.success.complete': '✓ Setup completado',
|
|
255
|
+
'setup.success.location': 'Ubicacion',
|
|
256
|
+
'setup.success.nextSteps': 'Siguientes pasos',
|
|
257
|
+
'setup.success.stepPubGet': 'flutter pub get',
|
|
258
|
+
'setup.success.stepRun': 'flutter run',
|
|
259
|
+
'validate.title': 'Kasy Validate',
|
|
260
|
+
'validate.success': '✓ Matriz de validación aprobada.',
|
|
261
|
+
'validate.failed': 'La matriz de validación fallo.',
|
|
262
|
+
'validate.error': 'Una o más combinaciones de validación fallaron.',
|
|
263
|
+
'validate.projectNotFound': 'Proyecto no encontrado',
|
|
264
|
+
'validate.ok': 'ok',
|
|
265
|
+
'validate.fail': 'fallo',
|
|
266
|
+
'validate.passed': 'aprobado',
|
|
267
|
+
|
|
268
|
+
// ── Flujo Firebase ────────────────────────────────────────────────────
|
|
269
|
+
'cli.command.firebase.description': '🔥 Crear app Flutter completo con Firebase (recomendado)',
|
|
270
|
+
'new.banner': '✨ Nuevo app Flutter',
|
|
271
|
+
'new.subtitle': 'Elige el backend: Firebase, Supabase o API REST.',
|
|
272
|
+
'new.subtitle2': '🔒 El setup corre en tu máquina con tus credenciales — sin acceso de terceros.',
|
|
273
|
+
'new.q.backend': '¿Donde quieres guardar los datos de tu app?',
|
|
274
|
+
'new.q.backend.firebase.desc': 'El más fácil para empezar — auth, base de datos y storage listos',
|
|
275
|
+
'new.q.backend.supabase.desc': 'Base de datos SQL (PostgreSQL) con más control',
|
|
276
|
+
'new.q.backend.api.desc': 'Ya tienes tu propio servidor',
|
|
277
|
+
|
|
278
|
+
'new.q.mode': '¿Como quieres configurar?',
|
|
279
|
+
'new.q.mode.quick': '⚡ Rápido — pocas preguntas, valores inteligentes',
|
|
280
|
+
'new.q.mode.advanced': '🛠 Avanzado — todas las opciones y credenciales ahora',
|
|
281
|
+
|
|
282
|
+
'new.q.preset': '¿Qué features incluir?',
|
|
283
|
+
'new.q.preset.starter': '⚡ Starter — analytics + errores + onboarding',
|
|
284
|
+
'new.q.preset.saas': '💰 SaaS — suscripciones + analytics + onboarding + feedback',
|
|
285
|
+
'new.q.preset.content': '📱 Contenido — crash reports + analytics + onboarding + AI chat',
|
|
286
|
+
'new.q.preset.full': '🚀 Completo — todas las features',
|
|
287
|
+
'new.q.preset.custom': '⚙️ Personalizar — elige feature a feature',
|
|
288
|
+
'new.q.preset.none': '○ Ninguno — solo el core',
|
|
289
|
+
|
|
290
|
+
'new.firebase.success.deployStep': '• Desplegar backend (desde dentro de la carpeta del proyecto):',
|
|
291
|
+
|
|
292
|
+
'cli.command.deploy.description': 'Publica el servidor en Firebase o Supabase',
|
|
293
|
+
'cli.command.check.description': 'Verifica si las notificaciones push están configuradas (usa --fix para arreglar)',
|
|
294
|
+
'deploy.q.project': 'Firebase Project ID:',
|
|
295
|
+
'deploy.q.serviceAccount': 'Ruta al service account JSON:',
|
|
296
|
+
'deploy.detected.project': '✓ Proyecto Firebase detectado:',
|
|
297
|
+
'deploy.detected.serviceAccount': '✓ Service account detectado:',
|
|
298
|
+
'deploy.error.notProject': 'No se encontro firebase.json. Ejecute kasy deploy desde dentro de la carpeta del proyecto.',
|
|
299
|
+
|
|
300
|
+
'cli.command.ios.description': 'Publica la app en la App Store (necesita Mac)',
|
|
301
|
+
'cli.command.ios.configure.description': 'Configurar credenciales Apple para subida local del IPA',
|
|
302
|
+
'cli.command.ios.release.description': 'Incrementa build, genera IPA y sube a App Store Connect',
|
|
303
|
+
'cli.command.ios.build.description': 'Solo genera el IPA (sin subir)',
|
|
304
|
+
'cli.command.ios.clean.description': 'Limpia cachés Flutter/Xcode tras fallo en build iOS',
|
|
305
|
+
'cli.command.ios.picker.intro': 'Publicar en la App Store',
|
|
306
|
+
'cli.command.ios.picker.message': '¿Qué quieres hacer?',
|
|
307
|
+
'cli.command.ios.help.before': 'Como publicar en la App Store:\n 1) kasy ios configure → hazlo una vez (guarda las credenciales Apple)\n 2) kasy ios release → ejecuta en cada nueva version (build + subida)\n\nUsa "build" si solo quieres generar el IPA, "clean" si un build fallo.\n',
|
|
308
|
+
'cli.command.codemagic.description': 'Compila la app en la nube (sin necesitar Mac)',
|
|
309
|
+
'cli.command.codemagic.configure.description': 'Configurar credenciales API de Codemagic',
|
|
310
|
+
'cli.command.codemagic.release.description': 'Iniciar build del workflow iOS en Codemagic',
|
|
311
|
+
'cli.command.codemagic.status.description': 'Estado del build Codemagic por ID',
|
|
312
|
+
'cli.command.codemagic.picker.intro': 'Compilar en la nube con Codemagic',
|
|
313
|
+
'cli.command.codemagic.picker.message': '¿Qué quieres hacer?',
|
|
314
|
+
'cli.command.codemagic.picker.statusHint': 'Pregunta el ID del build',
|
|
315
|
+
'cli.command.codemagic.help.before': 'Como compilar con Codemagic (sin necesitar Mac):\n 1) kasy codemagic configure → hazlo una vez (guarda el token de la API)\n 2) kasy codemagic release → inicia un build en la nube por version\n\nUsa "status <buildId>" para seguir el progreso de un build.\n',
|
|
316
|
+
|
|
317
|
+
'ios.configure.title': 'App Store iOS — configuración',
|
|
318
|
+
'ios.configure.bundleId': 'Bundle ID',
|
|
319
|
+
'ios.configure.doc': 'Guía',
|
|
320
|
+
'ios.configure.openingLinks': 'Abriendo App Store Connect en el navegador…',
|
|
321
|
+
'ios.configure.note.title': 'Voy a pedir 3 cosas de App Store Connect',
|
|
322
|
+
'ios.configure.note.body': '1) API Key ID — en Users and Access → Keys.\n2) Issuer ID — arriba de la misma pagina.\n3) El archivo .p8 (clave privada) descargado al crear la key.\n\nEl App ID es opcional, solo si tienes varias apps.',
|
|
323
|
+
'ios.configure.q.apiKey': 'Key ID de la API App Store Connect',
|
|
324
|
+
'ios.configure.q.issuerId': 'Issuer ID (UUID)',
|
|
325
|
+
'ios.configure.q.p8Path': 'Ruta del archivo AuthKey_XXXXX.p8 descargado',
|
|
326
|
+
'ios.configure.q.appId': 'App ID en App Store Connect (opcional)',
|
|
327
|
+
'ios.configure.q.required': 'Obligatorio',
|
|
328
|
+
'ios.configure.q.p8NotFound': 'Archivo no encontrado',
|
|
329
|
+
'ios.configure.cancelled': 'Configuración cancelada',
|
|
330
|
+
'ios.configure.success': 'Credenciales Apple guardadas',
|
|
331
|
+
'ios.configure.p8Installed': 'Clave instalada en',
|
|
332
|
+
'ios.configure.next': 'Siguiente paso',
|
|
333
|
+
'ios.release.title': 'Generando y subiendo release iOS…',
|
|
334
|
+
'ios.release.success': 'Release iOS subida',
|
|
335
|
+
'ios.release.task.building': 'Compilando IPA (puede tardar 2-5 min)…',
|
|
336
|
+
'ios.release.task.uploading': 'Subiendo IPA a App Store Connect…',
|
|
337
|
+
'ios.release.task.done': 'Compilacion + subida completadas',
|
|
338
|
+
'ios.release.task.failed': 'La compilacion fallo — mira la salida debajo',
|
|
339
|
+
'ios.build.title': 'Generando IPA iOS…',
|
|
340
|
+
'ios.build.success': 'IPA generado',
|
|
341
|
+
'ios.build.task.building': 'Compilando IPA (puede tardar 2-5 min)…',
|
|
342
|
+
'ios.build.task.done': 'IPA listo en build/ios/ipa/',
|
|
343
|
+
'ios.build.task.failed': 'La compilacion fallo — mira la salida debajo',
|
|
344
|
+
'ios.error.notProject': 'No es un proyecto Flutter iOS (pubspec.yaml + ios/ requeridos).',
|
|
345
|
+
'ios.error.noScript': 'scripts/release-ios.sh no encontrado. Ejecute: kasy update ios-release',
|
|
346
|
+
'ios.error.notMac': 'Release iOS local requiere macOS con Xcode.',
|
|
347
|
+
'ios.error.useCodemagic': 'Use release en la nube',
|
|
348
|
+
'ios.error.notConfigured': 'Credenciales Apple no configuradas',
|
|
349
|
+
'ios.error.runConfigure': 'Ejecute: kasy ios configure',
|
|
350
|
+
'ios.release.askConfigure': '¿Quieres configurar las credenciales Apple ahora?',
|
|
351
|
+
'ios.error.signing': 'Firma iOS no configurada (falta DEVELOPMENT_TEAM).',
|
|
352
|
+
'ios.error.signingHint': 'Abra ios/Runner.xcworkspace en Xcode → Runner → Signing & Capabilities → elija su Team.',
|
|
353
|
+
'ios.error.googleUrlScheme': 'URL scheme iOS de Google Sign-In no configurado.',
|
|
354
|
+
'ios.error.googleUrlSchemeHint': 'Corrección: ejecute flutterfire configure, luego kasy ios clean, o regenere el proyecto antes del build.',
|
|
355
|
+
'ios.warn.lowDisk': 'Poco espacio en disco ({gb} GB libres; se recomiendan al menos {min} GB para builds Xcode).',
|
|
356
|
+
'ios.hints.title': 'La caché de Xcode puede estar corrupta — intente:',
|
|
357
|
+
'ios.hints.closeXcode': 'Cierre Xcode por completo',
|
|
358
|
+
'ios.hints.retry': 'Luego reintente',
|
|
359
|
+
'ios.hints.manual': 'O manualmente',
|
|
360
|
+
'ios.hints.network.title': 'Fallo de red al descargar dependencias de iOS',
|
|
361
|
+
'ios.hints.network.body': 'Tu conexión se cayó mientras pod install descargaba librerías. Suele ser temporal.',
|
|
362
|
+
'ios.hints.network.step1': 'Confirma que tu internet está estable',
|
|
363
|
+
'ios.hints.network.step2': 'Intenta de nuevo',
|
|
364
|
+
'ios.hints.network.step3': 'Si persiste',
|
|
365
|
+
'ios.clean.title': 'Limpiando cachés de build iOS…',
|
|
366
|
+
'ios.clean.success': 'Cachés limpiadas',
|
|
367
|
+
'ios.clean.notMac': 'La limpieza iOS solo está disponible en macOS.',
|
|
368
|
+
'ios.clean.step.flutterClean': 'flutter clean',
|
|
369
|
+
'ios.clean.step.derivedData': 'Eliminar DerivedData de Xcode (Runner)',
|
|
370
|
+
'ios.clean.step.buildDir': 'Eliminar carpetas build',
|
|
371
|
+
'ios.clean.step.pubGet': 'flutter pub get',
|
|
372
|
+
'ios.clean.step.pods': 'pod install',
|
|
373
|
+
|
|
374
|
+
'codemagic.configure.title': 'Codemagic — configuración',
|
|
375
|
+
'codemagic.configure.doc': 'Guía',
|
|
376
|
+
'codemagic.configure.checklist': 'Complete firma + App Store Connect en el panel Codemagic (vea la guía).',
|
|
377
|
+
'codemagic.configure.openingLinks': 'Abriendo Codemagic en el navegador…',
|
|
378
|
+
'codemagic.configure.q.token': 'Token API de Codemagic',
|
|
379
|
+
'codemagic.configure.q.appId': 'App ID en Codemagic',
|
|
380
|
+
'codemagic.configure.q.workflowId': 'Workflow ID (de codemagic.yaml)',
|
|
381
|
+
'codemagic.configure.q.branch': 'Rama Git para build',
|
|
382
|
+
'codemagic.configure.q.required': 'Obligatorio',
|
|
383
|
+
'codemagic.configure.cancelled': 'Configuración cancelada',
|
|
384
|
+
'codemagic.configure.success': 'Credenciales Codemagic guardadas',
|
|
385
|
+
'codemagic.configure.next': 'Siguiente paso',
|
|
386
|
+
'codemagic.release.title': 'Disparando build en Codemagic…',
|
|
387
|
+
'codemagic.release.triggered': 'Build iniciado',
|
|
388
|
+
'codemagic.release.spin': 'Iniciando build en Codemagic…',
|
|
389
|
+
'codemagic.release.spinDone': 'Build encolado en Codemagic',
|
|
390
|
+
'codemagic.status.title': 'Estado del build',
|
|
391
|
+
'codemagic.status.usage': 'Uso: kasy codemagic status <buildId>',
|
|
392
|
+
'codemagic.status.spin': 'Consultando estado del build…',
|
|
393
|
+
'codemagic.status.spinDone': 'Estado obtenido',
|
|
394
|
+
'codemagic.error.notProject': 'No es un proyecto Flutter iOS (pubspec.yaml + ios/ requeridos).',
|
|
395
|
+
'codemagic.error.notConfigured': 'Codemagic no configurado',
|
|
396
|
+
'codemagic.error.addCi': 'Agregue CI primero: kasy add ci (crea codemagic.yaml)',
|
|
397
|
+
'codemagic.error.runConfigure': 'Ejecute: kasy codemagic configure',
|
|
398
|
+
'codemagic.error.googleUrlScheme': 'Build Codemagic bloqueado: URL scheme iOS de Google Sign-In no configurado.',
|
|
399
|
+
|
|
400
|
+
'doctor.ios.title': 'Release iOS',
|
|
401
|
+
'doctor.ios.appleOk': 'Credenciales Apple configuradas',
|
|
402
|
+
'doctor.ios.appleMissing': 'Credenciales Apple faltantes — kasy ios configure',
|
|
403
|
+
'doctor.ios.p8Ok': 'Archivo de clave API encontrado',
|
|
404
|
+
'doctor.ios.p8Missing': 'AuthKey .p8 faltante — kasy ios configure',
|
|
405
|
+
'doctor.ios.codemagicOk': 'Credenciales Codemagic configuradas',
|
|
406
|
+
'doctor.ios.codemagicMissing': 'Codemagic opcional — kasy codemagic configure',
|
|
407
|
+
'doctor.ios.notMac': 'Release iOS local requiere macOS',
|
|
408
|
+
'doctor.ios.doc': 'Documentación',
|
|
409
|
+
'doctor.ios.signingOk': 'Firma Xcode (Development Team) configurada',
|
|
410
|
+
'doctor.ios.signingMissing': 'Firma Xcode no definida — abra Runner en Xcode y elija su Team',
|
|
411
|
+
'doctor.ios.googleUrlSchemeOk': 'URL scheme iOS de Google Sign-In configurado',
|
|
412
|
+
'doctor.ios.googleUrlSchemeMissing': 'URL scheme iOS de Google Sign-In divergente',
|
|
413
|
+
'doctor.ios.googleUrlSchemeSkipped': 'Check del URL scheme iOS de Google Sign-In omitido (GoogleService-Info.plist ausente)',
|
|
414
|
+
'doctor.ios.appleSignInEntitlementOk': 'Entitlement de Apple Sign-In configurado',
|
|
415
|
+
'doctor.ios.appleSignInEntitlementMissing': 'Entitlement de Apple Sign-In ausente — agrega la capability Sign In with Apple en Xcode',
|
|
416
|
+
'doctor.ios.facebookOk': 'Credenciales de Facebook configuradas (iOS)',
|
|
417
|
+
'doctor.ios.facebookPlaceholders': 'Credenciales de Facebook son aún placeholders — actualiza FacebookAppID y FacebookClientToken en Info.plist',
|
|
418
|
+
'doctor.ios.facebookSkipped': 'Check de credenciales de Facebook omitido (FacebookAppID ausente en Info.plist)',
|
|
419
|
+
'doctor.android.facebookOk': 'Credenciales de Facebook configuradas (Android)',
|
|
420
|
+
'doctor.android.facebookPlaceholders': 'Credenciales de Facebook son aún placeholders — actualiza facebook_app_id y facebook_client_token en android/app/src/main/res/values/strings.xml',
|
|
421
|
+
|
|
422
|
+
'doctor.revenuecat.title': 'RevenueCat',
|
|
423
|
+
'doctor.revenuecat.keysOk': 'Claves de API configuradas (iOS + Android)',
|
|
424
|
+
'doctor.revenuecat.keysEmpty': 'Claves de API no configuradas — define RC_IOS_API_KEY y RC_ANDROID_API_KEY en Makefile y .vscode/launch.json',
|
|
425
|
+
'doctor.revenuecat.keysTest': 'Usando claves Test Store (test_) — reemplaza por appl_ y goog_ para producción',
|
|
426
|
+
'doctor.revenuecat.webhookUrlSupabase': 'URL del webhook (pega en RevenueCat → Integrations → Webhooks)',
|
|
427
|
+
'doctor.revenuecat.webhookUrlFirebase': 'URL del webhook: Firebase Console → Functions → subscriptionsOnRcPremiumUpdate',
|
|
428
|
+
|
|
429
|
+
'update.iosRelease.success': 'Archivos de release iOS actualizados',
|
|
430
|
+
'add.iosRelease.success': 'Archivos de release iOS agregados',
|
|
431
|
+
'add.iosRelease.already': 'Archivos de release iOS ya presentes',
|
|
432
|
+
|
|
433
|
+
'new.api.q.baseUrl': '¿Cual es la URL base de tu API?',
|
|
434
|
+
'new.api.q.baseUrl.hint': 'https://api.example.com',
|
|
435
|
+
'new.firebase.banner': '🔥 Nuevo app Flutter — Firebase',
|
|
436
|
+
'new.firebase.subtitle': 'Proyecto completo: auth, Firestore, notificaciones, login social y más.',
|
|
437
|
+
'new.prereq.title': 'Antes de empezar, asegúrate de tener:',
|
|
438
|
+
'new.firebase.prereq.title': 'Antes de empezar, asegúrate de tener:',
|
|
439
|
+
'new.firebase.prereq.create.1': '1. gcloud CLI (cloud.google.com/sdk) + gcloud auth login',
|
|
440
|
+
'new.firebase.prereq.create.2': '2. Plan Blaze (tarjeta de crédito — requerido para Cloud Functions)',
|
|
441
|
+
'new.firebase.prereq.create.billingLimit': '3. Límite: hasta 3 proyectos por cuenta de facturación. Elimina proyectos no usados o solicita aumento de cuota si ya alcanzaste el límite.',
|
|
442
|
+
'new.firebase.prereq.create.projectQuota': '4. Cuota de proyectos: la cuenta Google tiene un límite (ej. 10–30 proyectos). Elimina proyectos no usados en console.cloud.google.com si es necesario.',
|
|
443
|
+
'new.firebase.prereq.create.note': ' Proyecto y APIs se crearán automáticamente.',
|
|
444
|
+
'new.firebase.prereq.create.pushNote': ' Proyecto Firebase para FCM + Remote Config se creará automáticamente (sin cuenta de servicio).',
|
|
445
|
+
'new.firebase.prereq.1': '1. Firebase CLI instalado (npm i -g firebase-tools) + firebase login',
|
|
446
|
+
'new.firebase.prereq.2': '2. Proyecto Firebase creado en console.firebase.google.com',
|
|
447
|
+
'new.firebase.prereq.3': '3. Plan Blaze activado (tarjeta de crédito — requerido para Cloud Functions)',
|
|
448
|
+
'new.firebase.prereq.4': '4. gcloud CLI instalado + gcloud auth login (para activar APIs automáticamente)',
|
|
449
|
+
'new.firebase.prereq.5': '5. Antes del deploy: activa Secret Manager API y Firebase Storage (ver PREREQUISITES.md o enlaces tras generar)',
|
|
450
|
+
'new.firebase.prereq.doc': ' Lista completa: PREREQUISITES.md',
|
|
451
|
+
|
|
452
|
+
'new.firebase.q.appName': '¿Cuál es el nombre de tu app?',
|
|
453
|
+
'new.firebase.q.appName.hint': 'ej: Mi App Increible',
|
|
454
|
+
'new.firebase.q.appName.required': 'El nombre de la app es obligatorio.',
|
|
455
|
+
|
|
456
|
+
'new.firebase.q.bundleId': '¿Cuál es el identificador único (Bundle ID) de tu app?',
|
|
457
|
+
'new.firebase.q.bundleId.hint': 'Funciona como una dirección para tu app, ej: com.miempresa.miapp',
|
|
458
|
+
'new.firebase.q.bundleId.invalid': 'Formato inválido. Usa: com.empresa.app',
|
|
459
|
+
'new.firebase.q.bundleId.required': 'El Bundle ID es obligatorio.',
|
|
460
|
+
|
|
461
|
+
'new.firebase.q.projectId': '¿Cuál es el ID de tu proyecto Firebase?',
|
|
462
|
+
'new.firebase.q.projectId.hint': 'Encuéntralo en Firebase Console → tu proyecto → Configuración',
|
|
463
|
+
'new.firebase.q.projectId.required': 'El Firebase Project ID es obligatorio.',
|
|
464
|
+
|
|
465
|
+
'new.firebase.q.modules': '¿Qué features opcionales quieres incluir?',
|
|
466
|
+
'new.firebase.q.modules.hint': 'Espacio para seleccionar, Enter para confirmar',
|
|
467
|
+
'new.modules.header.common': '── Comunes (todos los backends) ──',
|
|
468
|
+
'new.modules.header.features': '── Pantallas y features ──',
|
|
469
|
+
'new.modules.header.feedback': '── Feedback (Firebase + Supabase) ──',
|
|
470
|
+
'new.modules.header.ci': '── CI/CD ──',
|
|
471
|
+
'new.modules.header.monetization': '── Monetizacion ──',
|
|
472
|
+
'new.firebase.module.revenuecat': '💰 RevenueCat (activa Subscriptions)',
|
|
473
|
+
'new.firebase.module.sentry': '🚨 Crash Reports (Sentry)',
|
|
474
|
+
'new.firebase.module.analytics': '📊 Analytics (Mixpanel)',
|
|
475
|
+
'new.firebase.module.facebook': '👤 Facebook (Login + Ads)',
|
|
476
|
+
'new.firebase.module.web': '🌐 Web Support (PWA, solo Firebase)',
|
|
477
|
+
'new.firebase.module.widget': '📱 Home Widget (iOS/Android)',
|
|
478
|
+
'new.firebase.module.llm_chat': '🤖 AI Chat (OpenAI/Gemini)',
|
|
479
|
+
'new.firebase.module.local_notifications': '🔔 Local Reminders (sin servidor)',
|
|
480
|
+
'new.firebase.module.feedback': '💬 Feature Requests (requiere Firebase o Supabase)',
|
|
481
|
+
'new.firebase.module.ci': '⚙️ CI/CD (GitHub + Codemagic)',
|
|
482
|
+
'new.firebase.module.onboarding': '👋 Onboarding (flujo de bienvenida)',
|
|
483
|
+
|
|
484
|
+
'new.firebase.q.secrets.configureNow': '¿Configurar los secrets del servidor ahora? (webhook RevenueCat, Meta Ads)',
|
|
485
|
+
'new.firebase.q.secrets.configureNow.hint': 'Si no ahora, vea el README para los comandos de configuración después',
|
|
486
|
+
'new.firebase.q.secrets.later': '• Secrets del servidor no configurados — se configurarán durante `kasy deploy`.',
|
|
487
|
+
'new.firebase.q.revenuecat.webhookKey': 'Clave secreta del webhook (se sugirió un valor aleatorio — presiona Enter para aceptar o escribe el tuyo)',
|
|
488
|
+
'new.firebase.q.revenuecat.webhookKey.hint': 'Guarda este valor. En el panel RevenueCat, pega como: Bearer <este-valor>',
|
|
489
|
+
'new.firebase.q.revenuecat.metaToken': 'Meta Access Token (Conversions API, opcional)',
|
|
490
|
+
'new.firebase.q.revenuecat.metaDataset': 'Meta Dataset ID / Pixel ID (opcional)',
|
|
491
|
+
'new.firebase.q.revenuecat.android': 'Clave API RevenueCat para Android',
|
|
492
|
+
'new.firebase.q.revenuecat.ios': 'Clave API RevenueCat para iOS',
|
|
493
|
+
'new.firebase.q.paywall': '¿Qué estilo de paywall?',
|
|
494
|
+
'new.firebase.q.paywall.hint': 'Layout de la pantalla de suscripciones — puedes cambiarlo después en RevenueCat',
|
|
495
|
+
'new.firebase.q.revenuecat.web': '¿Habilitar suscripciones en web (RevenueCat Web Billing)?',
|
|
496
|
+
'new.firebase.q.revenuecat.web.hint': 'Requiere Web Billing en dashboard RevenueCat + Stripe. Deja desmarcado si no necesitas.',
|
|
497
|
+
'new.firebase.q.revenuecat.webKey': 'Clave API RevenueCat Web Billing (rcb_xxx o rcb_sb_xxx, opcional — configurar después)',
|
|
498
|
+
'new.firebase.success.revenuecatWeb': '• RevenueCat Web: agrega RC_WEB_API_KEY (launch.json) para suscripciones en web',
|
|
499
|
+
'new.firebase.q.sentry.dsn': 'DSN de Sentry (deja en blanco para configurar después)',
|
|
500
|
+
'new.firebase.q.sentry.dsn.invalid': 'DSN inválido. Formato esperado: https://clave@host/project-id',
|
|
501
|
+
'new.firebase.q.mixpanel.token': 'Token de Mixpanel (deja en blanco para configurar después)',
|
|
502
|
+
'new.firebase.q.facebook.appId': 'App ID de Facebook',
|
|
503
|
+
'new.firebase.q.facebook.appId.required': 'App ID de Facebook es obligatorio.',
|
|
504
|
+
'new.firebase.q.facebook.appId.invalid': 'App ID de Facebook debe ser numérico (ej: 1234567890).',
|
|
505
|
+
'new.firebase.q.facebook.token': 'Token de App Facebook',
|
|
506
|
+
'new.firebase.q.facebook.token.required': 'Token de App Facebook es obligatorio.',
|
|
507
|
+
'new.firebase.q.revenuecat.android.required': 'Clave Android de RevenueCat es obligatoria.',
|
|
508
|
+
'new.firebase.q.revenuecat.ios.required': 'Clave iOS de RevenueCat es obligatoria.',
|
|
509
|
+
'new.firebase.q.revenuecat.metaDataset.invalid': 'Pixel ID debe ser numérico (ej: 1234567890).',
|
|
510
|
+
'new.firebase.q.revenuecat.webKey.invalid': 'La clave Web Billing debe empezar con rcb_ (ej: rcb_sb_xxx o rcb_xxx).',
|
|
511
|
+
|
|
512
|
+
'new.firebase.confirm.title': 'Resumen de configuración:',
|
|
513
|
+
'new.firebase.confirm.app': 'App',
|
|
514
|
+
'new.firebase.confirm.bundleId': 'Bundle ID',
|
|
515
|
+
'new.firebase.confirm.project': 'Firebase',
|
|
516
|
+
'new.firebase.confirm.modules': 'Features',
|
|
517
|
+
'new.firebase.confirm.none': 'ninguno',
|
|
518
|
+
'new.firebase.confirm.proceed': '¿Crear el proyecto ahora?',
|
|
519
|
+
|
|
520
|
+
'new.firebase.step.copying': 'Copiando plantilla del proyecto...',
|
|
521
|
+
'new.firebase.step.pubGet': 'Instalando paquetes Flutter...',
|
|
522
|
+
'new.firebase.step.buildRunner': 'Generando código (Riverpod/Freezed)...',
|
|
523
|
+
'new.firebase.step.flutterfire': 'Configurando Firebase (flutterfire)...',
|
|
524
|
+
'new.firebase.step.deploy': 'Desplegando Cloud Functions + reglas de Firestore...',
|
|
525
|
+
'new.firebase.step.done': '¡Listo!',
|
|
526
|
+
|
|
527
|
+
'new.firebase.success.title': '🎉 ¡Tu app está lista!',
|
|
528
|
+
'new.firebase.success.open': 'Abre el proyecto:',
|
|
529
|
+
'new.firebase.success.run': 'Ejecuta el app:',
|
|
530
|
+
'new.firebase.success.runMake': 'O usa make: make run | make run-ios | make run-android',
|
|
531
|
+
'new.firebase.success.deviceSetup': 'Antes de ejecutar en dispositivo:',
|
|
532
|
+
'new.firebase.success.deviceSetup.ios': 'iOS: conecta iPhone por cable → confiar en este ordenador → Xcode → Window → Devices → emparejar',
|
|
533
|
+
'new.firebase.success.deviceSetup.android': 'Android: Ajustes → Opciones de desarrollador → activar depuración USB',
|
|
534
|
+
'new.firebase.success.hotReload': "Hot reload: pulsa 'r' en la terminal mientras el app corre. Los cambios aparecen al instante.",
|
|
535
|
+
'new.firebase.success.oneLiner': 'O copia y pega para entrar y ejecutar:',
|
|
536
|
+
'new.firebase.success.configure': 'Configura cuando quieras:',
|
|
537
|
+
'new.firebase.success.alreadyDone': 'Ya configurado por la CLI:',
|
|
538
|
+
'new.firebase.success.manualNeeded': 'Configura manualmente (si hace falta):',
|
|
539
|
+
'new.firebase.success.apn': '• Clave APN (push iOS): Firebase Console → Config. del Proyecto → Cloud Messaging',
|
|
540
|
+
'new.firebase.success.social': '• Activa login social en Firebase Console → Authentication (Google y Apple ya están en el código; solo actívalos allí)',
|
|
541
|
+
'new.firebase.success.googleSignIn': '• Login con Gmail: 1) Activa en Firebase Console → Auth → Sign-in method → Google. 2) El CLI rellena kGoogleWebClientId (google_auth_options.dart) desde google-services.json para Android/iOS. Web usa signInWithPopup.',
|
|
542
|
+
'new.firebase.success.sentry': '• Sentry: Para reportes de error en producción. Obtén DSN en sentry.io. Ya en launch.json para dev. Para release: --dart-define=SENTRY_DSN=xxx',
|
|
543
|
+
'new.firebase.success.mixpanel': '• Mixpanel: Para analytics en producción. Ya en launch.json para dev. Para release: --dart-define=MIXPANEL_TOKEN=xxx',
|
|
544
|
+
'new.firebase.success.web': '• Web (adicional): Android e iOS funcionan con normalidad. Para probar en browser: "flutter run -d chrome" o "flutter run -d web-server --web-port=5000". Para publicar: "flutter build web". Las notificaciones push son exclusivas de mobile y se desactivan automaticamente en web.',
|
|
545
|
+
|
|
546
|
+
'new.firebase.q.deploy': '¿Hacer deploy de Cloud Functions + reglas de Firestore ahora?',
|
|
547
|
+
'new.firebase.q.deploy.hint': 'Requiere plan Blaze y firebase-tools instalado globalmente',
|
|
548
|
+
'new.firebase.deployFailed.hint': 'Si el deploy falló: crea Firestore y Storage en la Consola primero:',
|
|
549
|
+
'new.firebase.deployFailed.firestore': '• Firestore: crea la base (Crear base → Modo Nativo)',
|
|
550
|
+
'new.firebase.deployFailed.storage': '• Storage: clic en Comenzar',
|
|
551
|
+
'new.firebase.deployFailed.orGcloud': 'O crea Firestore por CLI:',
|
|
552
|
+
'new.firebase.success.deployLater': '• Deploy del backend cuando estés listo (desde dentro de la carpeta del proyecto):',
|
|
553
|
+
'new.firebase.success.beforeDeploy': 'Antes del firebase deploy, activa (clic para abrir):',
|
|
554
|
+
'new.firebase.success.secretManager': '• Secret Manager API',
|
|
555
|
+
'new.firebase.success.firestore': '• Firestore (crea la base si no existe)',
|
|
556
|
+
'new.firebase.success.storage': '• Firebase Storage (Comenzar)',
|
|
557
|
+
'new.firebase.success.auth': '• Firebase Authentication (Email/Contraseña)',
|
|
558
|
+
'new.firebase.success.security': '🔒 .gitignore excluye .env y otros secretos. Cloud Functions usan secrets en el servidor.',
|
|
559
|
+
|
|
560
|
+
'new.firebase.interactive.title': '⚠️ Configuración de la Nube Requerida',
|
|
561
|
+
'new.firebase.interactive.desc': 'Por medidas de seguridad de Google, necesitas hacer estos pasos:',
|
|
562
|
+
'new.firebase.interactive.step1': '1. Crea la base de datos (Firestore): ',
|
|
563
|
+
'new.firebase.interactive.step2': '2. Sube al plan Blaze (Pay-as-you-go): ',
|
|
564
|
+
'new.firebase.interactive.step3': '3. Habilita Auth (Email y Contraseña): ',
|
|
565
|
+
|
|
566
|
+
'new.firebase.interactive.prompt1': '¿Ya creaste Firestore y habilitaste Autenticación en el enlace arriba?',
|
|
567
|
+
'new.firebase.interactive.prompt2': '¿Hiciste el upgrade al Plan Blaze? (Requerido para Cloud Functions)',
|
|
568
|
+
'new.firebase.interactive.googleAuthNote': '* Activa Google Sign-In manualmente (Email/Contraseña y Anônimo ya fueron activados): ',
|
|
569
|
+
'new.firebase.interactive.billingNeeded': 'Plan Blaze aún no activo. Actívalo en el enlace de arriba y espera la detección automática.',
|
|
570
|
+
'new.firebase.interactive.billingWaiting': 'Verificando estado del Blaze...',
|
|
571
|
+
'new.firebase.interactive.billingTimeout': 'Plan Blaze no confirmado tras el tiempo límite. Despliegue omitido — ejecuta manualmente cuando estés listo.',
|
|
572
|
+
'new.firebase.interactive.authWarn': 'No se pudo activar Email/Contraseña y Anónimo automáticamente. Actívalos manualmente:',
|
|
573
|
+
'new.firebase.existing.apisFailed': 'No se pudieron activar las APIs:',
|
|
574
|
+
'new.firebase.existing.googleSignInManual': 'Google Sign-In: activa manualmente en Authentication → Sign-in method → Google',
|
|
575
|
+
|
|
576
|
+
'new.firebase.interactive.ready': '¿Listo para publicar Push Notifications + Reglas ahora?',
|
|
577
|
+
'new.firebase.interactive.deploying': 'Desplegando Cloud Functions + Reglas (Storage y Firestore)...',
|
|
578
|
+
'new.firebase.interactive.errorTitle': 'Ocurrio un error en el despliegue.',
|
|
579
|
+
'new.firebase.interactive.errorHint': 'Revisa haber creado Firestore y activado el plan Blaze con tarjeta.',
|
|
580
|
+
'new.firebase.interactive.laterHint': 'Puedes publicar luego desde la carpeta de tu proyecto corriendo: ',
|
|
581
|
+
'new.firebase.interactive.skipped': 'Despliegue omitido. Puedes publicar más tarde.',
|
|
582
|
+
|
|
583
|
+
'new.firebase.warn.flutterfire': '⚠️ FlutterFire no pudo generar firebase_options_dev.dart automáticamente.',
|
|
584
|
+
'new.firebase.warn.flutterfire.manual': 'Ejecuta manualmente en la carpeta del proyecto:',
|
|
585
|
+
|
|
586
|
+
'new.firebase.error.templateMissing': 'Plantilla Firebase no encontrada en: {path}. Asegúrate de que la carpeta Firebase/ existe.',
|
|
587
|
+
'new.firebase.error.dirNotEmpty': 'El directorio "{path}" ya existe y no está vacío.',
|
|
588
|
+
'new.firebase.error.aborted': 'Setup cancelado.',
|
|
589
|
+
|
|
590
|
+
'new.supabase.prereq.1': '1. Cuenta Supabase en supabase.com',
|
|
591
|
+
'new.supabase.prereq.2': '2. Supabase CLI + Firebase CLI instalados (ambos obligatorios)',
|
|
592
|
+
'new.supabase.prereq.3': '3. supabase login + firebase login (Firebase necesario para push)',
|
|
593
|
+
'new.supabase.prereq.login': ' Si creas manualmente: ten URL y anon key del proyecto listos',
|
|
594
|
+
'new.supabase.loginRequired': '⚠️ Debes estar conectado para crear proyecto. Ejecuta supabase login primero.',
|
|
595
|
+
'new.supabase.loginCommand': ' supabase login',
|
|
596
|
+
'new.supabase.success.done.db': '• Base de datos: tablas, politicas RLS',
|
|
597
|
+
'new.supabase.success.done.storage': '• Storage: bucket kasy con politicas',
|
|
598
|
+
'new.supabase.success.done.webhook': '• Edge Function revenuecat-webhook',
|
|
599
|
+
'new.supabase.success.done.secrets': '• Secrets de Edge Function (si se informaron)',
|
|
600
|
+
'new.supabase.success.done.launch': '• launch.json con Sentry, Mixpanel, RevenueCat',
|
|
601
|
+
'new.supabase.success.auth': '• Auth: Email ya activado. Activa Google, Apple y Facebook en: {authUrl}',
|
|
602
|
+
'new.supabase.success.storage': '• Storage: Bucket kasy creado con politicas (listo)',
|
|
603
|
+
'new.supabase.success.fcm': '• Push (FCM): Configura en Firebase Console (plan Blaze). App lista para Supabase + FCM. URL: {fcmUrl}',
|
|
604
|
+
'new.supabase.success.deployLater': '• Deploy del backend cuando estes listo (desde dentro de la carpeta del proyecto):',
|
|
605
|
+
|
|
606
|
+
'new.api.prereq.1': '1. Tu API REST corriendo y accesible',
|
|
607
|
+
'new.api.prereq.2': '2. URL base de la API (ej: https://api.yourapp.com)',
|
|
608
|
+
'new.api.prereq.3': '3. Firebase CLI obligatorio para notificaciones push (FCM)',
|
|
609
|
+
'new.api.success.backendUrl': '• Apunta BACKEND_URL a tu API en ejecución (launch.json)',
|
|
610
|
+
'new.api.success.fcm': '• Firebase es necesario para notificaciones push (FCM) — configura la clave APNs en la consola de Firebase',
|
|
611
|
+
'new.api.success.auth': '• Implementa los endpoints de auth social (Google, Apple) en tu backend',
|
|
612
|
+
|
|
613
|
+
'new.outdated.hint': 'los proyectos creados ahora no tendrán las últimas mejoras.',
|
|
614
|
+
'new.outdated.upgradeNow': '¿Actualizar a la última versión antes de crear? (requiere suscripción activa)',
|
|
615
|
+
'new.outdated.upgraded': '¡kasy actualizado! Ejecuta kasy new nuevamente.',
|
|
616
|
+
'new.success.title': '¡Proyecto creado con exito!',
|
|
617
|
+
'new.success.nextSteps': 'Proximos pasos:',
|
|
618
|
+
'new.success.step.cd': 'Ve a la carpeta del proyecto:',
|
|
619
|
+
'new.success.step.deploy': 'Despliega el backend en Firebase:',
|
|
620
|
+
'new.success.step.run': 'Ejecuta el app (con tus claves configuradas):',
|
|
621
|
+
'new.success.step.run.vscode': '(o F5 en VS Code)',
|
|
622
|
+
'new.success.step.console': 'Abre la consola del backend:',
|
|
623
|
+
'new.fcm.generating': 'Generando clave de Service Account FCM…',
|
|
624
|
+
'new.sha1.registering': 'Registrando SHA-1 para Google Sign-In (Android)…',
|
|
625
|
+
'new.sha1.failed': 'SHA-1 no añadido automaticamente: {error}',
|
|
626
|
+
'new.sha1.manual': 'Agregalo manualmente para que Google Sign-In funcione en Android:',
|
|
627
|
+
'new.sha1.skipped.apiFailed': 'SHA-1 no añadido automáticamente. Motivo: {error}',
|
|
628
|
+
'new.sha1.skipped.other': 'SHA-1 no añadido: {reason}',
|
|
629
|
+
'new.sha1.addManually': 'Agrega manualmente: Firebase Console → Configuración del proyecto → Tus apps → Android → Agregar huella digital',
|
|
630
|
+
'new.sha1.added': '✓ SHA-1 añadido (Google Sign-In)',
|
|
631
|
+
'new.firestore.created': '✓ Firestore creado automáticamente',
|
|
632
|
+
'new.firestore.notCreated.error': '⚠ Firestore no creado. Motivo: {error}',
|
|
633
|
+
'new.firestore.notCreated': '⚠ Firestore no creado automáticamente',
|
|
634
|
+
'new.storage.created': '✓ Firebase Storage creado automáticamente',
|
|
635
|
+
'new.storage.notCreated.error': '⚠ Storage no creado. Motivo: {error}',
|
|
636
|
+
'new.storage.notCreated': '⚠ Storage no creado automáticamente',
|
|
637
|
+
'new.activateManually': 'Activa manualmente en la consola:',
|
|
638
|
+
'new.fcm.serverConfig': 'Configura en tu servidor: FIREBASE_SERVICE_ACCOUNT_JSON="$(cat .kasy/fcm-service-account.json)"',
|
|
639
|
+
'new.apns.warning': '⚠ Push iOS: configura la APNs Key en Firebase Console',
|
|
640
|
+
'new.apns.step1': '1. Apple Developer Portal → Keys → crear APNs Key (.p8)',
|
|
641
|
+
'new.apns.step2': '2. Firebase Console → Cloud Messaging → app iOS → subir la APNs Key',
|
|
642
|
+
'new.firebase.create.estimatedTime': '(generalmente 3-5 min — no cierres la terminal)',
|
|
643
|
+
'new.internet.warning': '📶 Asegúrate de tener una conexión a internet estable — este paso requiere red.',
|
|
644
|
+
|
|
645
|
+
// run command
|
|
646
|
+
'cli.command.run.description': 'Corre la app en celular, simulador o navegador',
|
|
647
|
+
'cli.command.reset.description': 'Desinstala la app en simulador/emulador/dispositivo para probar como primera instalación',
|
|
648
|
+
'reset.title': 'Resetear app en el dispositivo',
|
|
649
|
+
'reset.scanning': 'Buscando simuladores, emuladores y dispositivos conectados...',
|
|
650
|
+
'reset.prompt.pickDevice': '¿En cuál quieres resetear?',
|
|
651
|
+
'reset.resetting': 'Reseteando',
|
|
652
|
+
'reset.reinstalling': 'Reinstalando la app...',
|
|
653
|
+
'reset.success.uninstalled': 'App desinstalada. Todos los datos y permisos fueron eliminados.',
|
|
654
|
+
'reset.info.notInstalled': 'La app no estaba instalada en este dispositivo.',
|
|
655
|
+
'reset.warn.noDevices': 'Ningún simulador, emulador o dispositivo en ejecución. Inicia uno e intenta de nuevo.',
|
|
656
|
+
'reset.warn.nothingSelected': 'Ningún dispositivo seleccionado.',
|
|
657
|
+
'reset.warn.iosUninstallFailed': 'simctl uninstall falló.',
|
|
658
|
+
'reset.warn.androidUninstallFailed': 'adb uninstall no devolvió éxito.',
|
|
659
|
+
'reset.warn.iosDeviceManual': 'iPhone físico: borra la app manualmente (mantén pulsado el ícono → Eliminar app), luego reinstala con kasy run.',
|
|
660
|
+
'reset.warn.iosDeviceUninstallFailed': 'devicectl no pudo desinstalar. Verifica que el iPhone esté desbloqueado y confíe en esta Mac.',
|
|
661
|
+
'reset.warn.webIncognito': 'Web: abre la app en una ventana de incógnito/privada del navegador para probar como nuevo visitante.',
|
|
662
|
+
'reset.warn.unknownPlatform': 'Plataforma no soportada',
|
|
663
|
+
'reset.error.notFlutterProject': 'No se encontró pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter.',
|
|
664
|
+
'reset.error.noIdentifier': 'No pude leer el bundle id ni el package name de Android de este proyecto.',
|
|
665
|
+
'reset.error.noBundleId': 'Bundle id de iOS no encontrado.',
|
|
666
|
+
'reset.error.noPackageName': 'applicationId de Android no encontrado.',
|
|
667
|
+
'reset.outro.skipped': 'Listo. La app no fue desinstalada.',
|
|
668
|
+
'reset.outro.uninstalledOnly': 'Listo. Ejecuta kasy run para reinstalar.',
|
|
669
|
+
'reset.outro.cancelled': 'Cancelado. La app no fue desinstalada.',
|
|
670
|
+
'reset.prompt.xcodeOpen': 'Xcode está abierto y va a entrar en conflicto con la instalación. ¿Qué quieres hacer?',
|
|
671
|
+
'reset.prompt.xcodeOpen.close': 'Cerrar Xcode automáticamente (recomendado)',
|
|
672
|
+
'reset.prompt.xcodeOpen.skip': 'Dejar Xcode abierto e intentar igual',
|
|
673
|
+
'reset.prompt.xcodeOpen.cancel': 'Cancelar reset',
|
|
674
|
+
'reset.info.xcodeClosed': 'Xcode cerrado.',
|
|
675
|
+
'reset.prompt.reinstallNow': 'App removida. Verifica en el dispositivo y reinstalar ahora?',
|
|
676
|
+
'reset.prompt.clearLauncherCache': '¿Limpiar también la caché del launcher ({pkg})? Soluciona el preview gris de los widgets.',
|
|
677
|
+
'reset.success.launcherCleared': 'Caché del launcher limpiada ({pkg}). Pantalla de inicio intacta.',
|
|
678
|
+
'reset.warn.launcherCacheFailed': 'No se pudo limpiar la caché del launcher.',
|
|
679
|
+
'reset.warn.launcherNotDetected': 'Launcher por defecto no detectado — saltando limpieza de caché.',
|
|
680
|
+
'run.launching': 'Iniciando app Flutter...',
|
|
681
|
+
'run.updateHint.prefix': 'Mejoras disponibles para el proyecto —',
|
|
682
|
+
'run.updateHint.suffix': 'para ver las novedades',
|
|
683
|
+
'run.spinner.building': 'Iniciando Flutter…',
|
|
684
|
+
'run.spinner.ready': 'Flutter listo — usa r (reload), R (restart), q (salir)',
|
|
685
|
+
'run.spinner.failed': 'Flutter run fallo antes de iniciar',
|
|
686
|
+
'run.stage.gradleFirstTime': 'Compilando Android (1.ª vez tarda 5-15 min — Gradle bajando dependencias)…',
|
|
687
|
+
'run.stage.gradle': 'Compilando Android…',
|
|
688
|
+
'run.stage.xcode': 'Compilando iOS…',
|
|
689
|
+
'run.stage.pods': 'Instalando pods iOS…',
|
|
690
|
+
'run.stage.installing': 'Instalando en el dispositivo…',
|
|
691
|
+
'run.stage.syncing': 'Sincronizando archivos con el dispositivo…',
|
|
692
|
+
'run.stage.buildSuccess': 'Build listo — abriendo la app…',
|
|
693
|
+
'run.error.notFlutterProject': 'No se encontro pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter.',
|
|
694
|
+
'run.error.flutterNotFound': 'Flutter no encontrado. Verifica que Flutter este instalado y en el PATH.',
|
|
695
|
+
|
|
696
|
+
// doctor project checks
|
|
697
|
+
'doctor.project.title': 'Proyecto',
|
|
698
|
+
'doctor.project.appName': 'Nombre del app',
|
|
699
|
+
'doctor.project.backend': 'Backend',
|
|
700
|
+
'doctor.project.bundleId': 'Bundle ID',
|
|
701
|
+
'doctor.project.pubGet': 'Dependencias instaladas (pubspec.lock presente)',
|
|
702
|
+
'doctor.project.pubGetMissing': 'Ejecuta flutter pub get — pubspec.lock no encontrado',
|
|
703
|
+
'doctor.project.modules': 'Features activos',
|
|
704
|
+
'doctor.project.noModules': 'Ninguna feature opcional activa',
|
|
705
|
+
|
|
706
|
+
// add command
|
|
707
|
+
'cli.command.add.description': 'Añade algo nuevo a tu app (ej: kasy add ai_chat)',
|
|
708
|
+
|
|
709
|
+
// docs command
|
|
710
|
+
'cli.command.docs.description': 'Abre la documentación completa',
|
|
711
|
+
|
|
712
|
+
// splash command
|
|
713
|
+
'cli.command.splash.description': 'Cambia los logos del splash (claro/oscuro) y regenera los assets nativos',
|
|
714
|
+
'splash.intro': 'Splash screen',
|
|
715
|
+
'splash.validating': 'Validando archivos PNG...',
|
|
716
|
+
'splash.validated': 'Los PNGs están bien',
|
|
717
|
+
'splash.copying': 'Copiando logos a assets/images/...',
|
|
718
|
+
'splash.copied': 'Logos copiados',
|
|
719
|
+
'splash.android12Generating': 'Generando variantes con padding para Android 12+...',
|
|
720
|
+
'splash.android12Generated': 'Variantes de Android 12+ generadas',
|
|
721
|
+
'splash.generating': 'Regenerando splash nativo (Android, iOS, Web)...',
|
|
722
|
+
'splash.generated': 'Splash nativo regenerado',
|
|
723
|
+
'splash.done': 'Listo. Ejecuta "flutter run" para ver el nuevo splash.',
|
|
724
|
+
'splash.warn.title': 'Avisos',
|
|
725
|
+
'splash.warn.noAlphaLight': '{path} no tiene canal alpha (fondo transparente). El logo aparecerá con fondo sólido en vez de transparente.',
|
|
726
|
+
'splash.warn.noAlphaDark': '{path} no tiene canal alpha (fondo transparente). El logo aparecerá con fondo sólido en vez de transparente.',
|
|
727
|
+
'splash.warn.smallLight': 'El logo claro mide {w}x{h}. Lo recomendado es al menos 768x768 para evitar bordes borrosos.',
|
|
728
|
+
'splash.warn.smallDark': 'El logo oscuro mide {w}x{h}. Lo recomendado es al menos 768x768 para evitar bordes borrosos.',
|
|
729
|
+
'splash.summary.title': 'Guardado',
|
|
730
|
+
'splash.summary.light': 'Modo claro',
|
|
731
|
+
'splash.summary.dark': 'Modo oscuro',
|
|
732
|
+
'splash.skipGenerate.title': 'Generación omitida',
|
|
733
|
+
'splash.skipGenerate.hint': 'Ejecuta `dart run flutter_native_splash:create` cuando estés listo.',
|
|
734
|
+
'splash.error.notKasyProject': 'No se encontró pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter/Kasy.',
|
|
735
|
+
'splash.error.bothRequired': '--light y --dark son obligatorios.',
|
|
736
|
+
'splash.error.fileNotFound': 'Archivo no encontrado: {path}',
|
|
737
|
+
'splash.error.notPng': 'Uno de los archivos no es un PNG válido.',
|
|
738
|
+
'splash.error.generateFailed': 'flutter_native_splash:create falló. Revisa la salida.',
|
|
739
|
+
|
|
740
|
+
// icon command
|
|
741
|
+
'cli.command.icon.description': 'Cambia el ícono del app (iOS + Android) y regenera los assets nativos',
|
|
742
|
+
'icon.intro': 'Ícono del app',
|
|
743
|
+
'icon.validating': 'Validando archivo PNG...',
|
|
744
|
+
'icon.validated': 'PNG está bien',
|
|
745
|
+
'icon.copying': 'Copiando ícono a assets/images/icon.png...',
|
|
746
|
+
'icon.copied': 'Ícono copiado',
|
|
747
|
+
'icon.generating': 'Regenerando íconos nativos (Android + iOS)...',
|
|
748
|
+
'icon.generated': 'Íconos nativos regenerados',
|
|
749
|
+
'icon.done': 'Listo. Desinstala el app del dispositivo y reinstala para ver el nuevo ícono.',
|
|
750
|
+
'icon.warn.title': 'Avisos',
|
|
751
|
+
'icon.warn.notSquare': 'El ícono mide {w}x{h} (no es cuadrado). La imagen se estirará. Usa una imagen cuadrada (1024x1024 recomendado).',
|
|
752
|
+
'icon.warn.small': 'El ícono mide {w}x{h}. Lo recomendado es al menos 1024x1024 (App Store exige ese tamaño).',
|
|
753
|
+
'icon.warn.hasAlpha': 'El ícono tiene transparencia. iOS rechaza íconos con canal alpha — flutter_launcher_icons lo elimina automáticamente (remove_alpha_ios: true).',
|
|
754
|
+
'icon.summary.title': 'Guardado',
|
|
755
|
+
'icon.summary.icon': 'Ícono del app',
|
|
756
|
+
'icon.skipGenerate.title': 'Generación omitida',
|
|
757
|
+
'icon.skipGenerate.hint': 'Ejecuta `dart run flutter_launcher_icons` cuando estés listo.',
|
|
758
|
+
'icon.reinstall.title': 'Importante',
|
|
759
|
+
'icon.reinstall.hint': 'iOS y Android cachean el ícono anterior. Desinstala el app y reinstala para ver el nuevo.',
|
|
760
|
+
'icon.error.notKasyProject': 'No se encontró pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter/Kasy.',
|
|
761
|
+
'icon.error.imageRequired': '--image es obligatorio.',
|
|
762
|
+
'icon.error.fileNotFound': 'Archivo no encontrado: {path}',
|
|
763
|
+
'icon.error.notPng': 'El archivo no es un PNG válido.',
|
|
764
|
+
'icon.error.generateFailed': 'flutter_launcher_icons falló. Revisa la salida.',
|
|
765
|
+
|
|
766
|
+
// favicon command
|
|
767
|
+
'cli.command.favicon.description': 'Cambia el favicon / ícono PWA de la web y regenera los assets web',
|
|
768
|
+
'favicon.intro': 'Favicon web',
|
|
769
|
+
'favicon.validating': 'Validando archivo PNG...',
|
|
770
|
+
'favicon.validated': 'PNG está bien',
|
|
771
|
+
'favicon.copying': 'Copiando favicon a assets/images/favicon.png...',
|
|
772
|
+
'favicon.copied': 'Favicon copiado',
|
|
773
|
+
'favicon.generating': 'Regenerando íconos web (favicon + tamaños PWA)...',
|
|
774
|
+
'favicon.generated': 'Íconos web regenerados',
|
|
775
|
+
'favicon.done': 'Listo. Ejecuta "flutter run -d chrome" para ver el nuevo favicon.',
|
|
776
|
+
'favicon.warn.title': 'Avisos',
|
|
777
|
+
'favicon.warn.notSquare': 'El favicon mide {w}x{h} (no es cuadrado). Se estirará. Usa una imagen cuadrada (512x512+ recomendado).',
|
|
778
|
+
'favicon.warn.small': 'El favicon mide {w}x{h}. Lo recomendado es al menos 512x512 para que se vea nítido en las pantallas de instalación PWA.',
|
|
779
|
+
'favicon.summary.title': 'Guardado',
|
|
780
|
+
'favicon.summary.favicon': 'Favicon',
|
|
781
|
+
'favicon.skipGenerate.title': 'Generación omitida',
|
|
782
|
+
'favicon.skipGenerate.hint': 'Ejecuta `dart run flutter_launcher_icons` cuando estés listo.',
|
|
783
|
+
'favicon.error.notKasyProject': 'No se encontró pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter/Kasy.',
|
|
784
|
+
'favicon.error.imageRequired': '--image es obligatorio.',
|
|
785
|
+
'favicon.error.fileNotFound': 'Archivo no encontrado: {path}',
|
|
786
|
+
'favicon.error.notPng': 'El archivo no es un PNG válido.',
|
|
787
|
+
'favicon.error.generateFailed': 'flutter_launcher_icons falló. Revisa la salida.',
|
|
788
|
+
|
|
789
|
+
// notifications command
|
|
790
|
+
'cli.command.notifications.description': 'Edita los textos de las notificaciones locales y recordatorios',
|
|
791
|
+
'cli.command.notifications.text.description': 'Define titulos y mensajes de notificaciones locales',
|
|
792
|
+
'cli.command.notifications.picker.intro': 'Editar textos de las notificaciones',
|
|
793
|
+
'cli.command.notifications.picker.message': '¿Qué quieres hacer?',
|
|
794
|
+
'notifications.error.notKasyProject': 'No se encontro kit_setup.json. Ejecuta dentro de un proyecto Kasy.',
|
|
795
|
+
'notifications.error.noI18n': 'lib/i18n/*.i18n.json no encontrado en este proyecto.',
|
|
796
|
+
'notifications.error.noFeatures': 'lib/core/config/features.dart no encontrado.',
|
|
797
|
+
'notifications.error.notEnabled': 'Notificaciones locales desactivadas. Ejecuta: kasy add local_notifications',
|
|
798
|
+
'notifications.error.cancelled': 'Cancelado.',
|
|
799
|
+
'notifications.prompt.intro': 'Textos de notificación local',
|
|
800
|
+
'notifications.prompt.hint': 'Demo Home = prueba instantanea en Features. Recordatorio = alerta programada en Ajustes.',
|
|
801
|
+
'notifications.prompt.demoTitle': 'Demo Home — titulo de la notificación',
|
|
802
|
+
'notifications.prompt.demoBody': 'Demo Home — descripción / cuerpo',
|
|
803
|
+
'notifications.prompt.reminderTitle': 'Recordatorio programado — titulo',
|
|
804
|
+
'notifications.prompt.reminderBody': 'Recordatorio programado — cuerpo',
|
|
805
|
+
'notifications.prompt.required': 'Obligatorio.',
|
|
806
|
+
'notifications.writing': 'Actualizando lib/i18n/*.i18n.json...',
|
|
807
|
+
'notifications.written': 'Actualizado: {langs}',
|
|
808
|
+
'notifications.slang': 'Ejecutando dart run slang...',
|
|
809
|
+
'notifications.slangDone': 'Traducciones regeneradas',
|
|
810
|
+
'notifications.slangFailed': 'dart run slang fallo — ejecuta manualmente en el proyecto',
|
|
811
|
+
'notifications.done': 'Textos de notificación local actualizados.',
|
|
812
|
+
'notifications.summary.demo': 'Home → Features (demo):',
|
|
813
|
+
'notifications.summary.reminder': 'Ajustes → Recordatorios (programado):',
|
|
814
|
+
|
|
815
|
+
'add.list.title': 'Features del proyecto',
|
|
816
|
+
'add.error.noModule': 'Indica el nombre de la feature o usa --list para ver las disponibles.',
|
|
817
|
+
'add.error.notKasyProject': 'kit_setup.json no encontrado. Ejecuta este comando dentro de un proyecto Kasy.',
|
|
818
|
+
'add.error.unknownModule': 'Feature desconocida: {module}\nDisponibles: {list}',
|
|
819
|
+
'add.alreadyActive': 'La feature "{module}" ya está activa en este proyecto.',
|
|
820
|
+
'add.applying': 'Agregando feature: {module}',
|
|
821
|
+
'add.applyingPatch': 'Aplicando cambios de la feature...',
|
|
822
|
+
'add.patchApplied': 'Patch aplicado',
|
|
823
|
+
'add.patchFailed': 'Patch fallo — revisa la salida anterior',
|
|
824
|
+
'add.pubGet': 'Instalando paquetes de Flutter (flutter pub get)...',
|
|
825
|
+
'add.pubGetDone': 'Dependencias actualizadas',
|
|
826
|
+
'add.pubGetFailed': 'Falló al instalar paquetes de Flutter — ejecuta `flutter pub get` manualmente',
|
|
827
|
+
'add.buildRunner': 'Generando código (Riverpod/Freezed)...',
|
|
828
|
+
'add.buildRunnerDone': 'Generación de código completada',
|
|
829
|
+
'add.buildRunnerFailed': 'Generación de código falló — ejecuta `dart run build_runner build` manualmente',
|
|
830
|
+
'add.success': 'Feature "{module}" agregada exitosamente.',
|
|
831
|
+
'add.cancelled': 'Cancelado.',
|
|
832
|
+
'add.prompt.sentryDsn': 'Sentry DSN (deja en blanco para configurar después):',
|
|
833
|
+
'add.prompt.mixpanelToken': 'Mixpanel Token (deja en blanco para configurar después):',
|
|
834
|
+
'add.prompt.rcAndroidKey': 'RevenueCat Android API key (deja en blanco para configurar después):',
|
|
835
|
+
'add.prompt.rcIosKey': 'RevenueCat iOS API key (deja en blanco para configurar después):',
|
|
836
|
+
'add.note.facebook': 'Agrega tu Facebook App ID y token en .vscode/launch.json (FB_APP_ID, FB_TOKEN).',
|
|
837
|
+
'new.q.llm_chat.configureNow': 'Configurar el agente de Chat LLM ahora?',
|
|
838
|
+
'new.q.llm_chat.configureNow.hint': 'Puedes omitir y ejecutar "kasy add llm_chat" después',
|
|
839
|
+
'add.llm_chat.reconfigure': 'Feature ya activa — reconfigurando solo las credenciales.',
|
|
840
|
+
'add.prompt.llmProvider': 'Proveedor de LLM:',
|
|
841
|
+
'add.prompt.llmSystemPrompt': 'Instruccion del agente — system prompt (deja en blanco para ninguna):\n Ejemplo: "Eres un asistente de soporte del app Fitsync. Solo responde sobre entrenamientos."\n >',
|
|
842
|
+
'add.prompt.llmApiKey': 'Clave de API (OpenAI o Gemini) — se guarda en el servidor, nunca en el app (deja en blanco para configurar después):',
|
|
843
|
+
'add.prompt.llmEndpoint': 'URL de tu endpoint LLM (deja en blanco para configurar después):',
|
|
844
|
+
'add.llm_chat.settingSecret': 'Guardando clave de API como secret en el servidor...',
|
|
845
|
+
'add.llm_chat.secretSet': 'Clave de API guardada como secret',
|
|
846
|
+
'add.llm_chat.secretFailed': 'No se pudo guardar el secret automaticamente — configuralo manualmente (ver instrucciones abajo)',
|
|
847
|
+
'add.llm_chat.skipSecret': 'Clave de API omitida — configura antes del deploy via CLI del servidor',
|
|
848
|
+
'add.llm_chat.deploying': 'Desplegando funcion LLM en el servidor...',
|
|
849
|
+
'add.llm_chat.deployed': 'Funcion LLM desplegada con exito',
|
|
850
|
+
'add.llm_chat.deployFailed': 'Deploy automático fallo — despliega manualmente (ver instrucciones abajo)',
|
|
851
|
+
'add.llm_chat.nextSteps.firebase': '\n Proximos pasos:\n 1. El LLM_CHAT_ENDPOINT en .vscode/launch.json ya fue pre-llenado.\n 2. Corre el app: kasy run\n',
|
|
852
|
+
'add.llm_chat.nextSteps.firebase.deployFailed': '\n Proximos pasos:\n 1. Deploy manual: firebase deploy --only functions:llmChat\n 2. El LLM_CHAT_ENDPOINT en .vscode/launch.json ya fue pre-llenado.\n 3. Corre el app: kasy run\n',
|
|
853
|
+
'add.llm_chat.nextSteps.supabase': '\n Proximos pasos:\n 1. El LLM_CHAT_ENDPOINT en .vscode/launch.json ya fue pre-llenado.\n 2. Corre el app: kasy run\n',
|
|
854
|
+
'add.llm_chat.nextSteps.supabase.deployFailed': '\n Proximos pasos:\n 1. Deploy manual: supabase functions deploy llm-chat --no-verify-jwt\n 2. El LLM_CHAT_ENDPOINT en .vscode/launch.json ya fue pre-llenado.\n 3. Corre el app: kasy run\n',
|
|
855
|
+
'add.llm_chat.nextSteps.api': '\n Proximos pasos:\n 1. Crea un endpoint en tu servidor que acepte {message, history} y llame tu LLM.\n 2. Actualiza LLM_CHAT_ENDPOINT en .vscode/launch.json con la URL de tu endpoint.\n 3. Corre el app: kasy run\n',
|
|
856
|
+
'cli.command.remove.description': 'Elimina algo que ya no usas (ej: kasy remove sentry)',
|
|
857
|
+
'remove.error.noModule': 'Ingresa el nombre de la feature. Uso: kasy remove <feature>',
|
|
858
|
+
'remove.error.notKasyProject': 'kit_setup.json no encontrado. Ejecuta este comando dentro de un proyecto Kasy.',
|
|
859
|
+
'remove.error.unknownModule': 'Feature desconocida: {module}\nDisponibles: {list}',
|
|
860
|
+
'remove.error.notActive': 'La feature "{module}" no está activa en este proyecto.',
|
|
861
|
+
'remove.confirm': 'Eliminar la feature "{module}"? Esto borrara archivos y dependencias.',
|
|
862
|
+
'remove.cancelled': 'Cancelado.',
|
|
863
|
+
'remove.removing': 'Eliminando feature: {module}',
|
|
864
|
+
'remove.pubGet': 'Instalando paquetes de Flutter (flutter pub get)...',
|
|
865
|
+
'remove.pubGetDone': 'Dependencias actualizadas',
|
|
866
|
+
'remove.pubGetFailed': 'Falló al instalar paquetes de Flutter — ejecuta `flutter pub get` manualmente',
|
|
867
|
+
'remove.buildRunner': 'Generando código (Riverpod/Freezed)...',
|
|
868
|
+
'remove.buildRunnerDone': 'Generación de código completada',
|
|
869
|
+
'remove.buildRunnerFailed': 'Generación de código falló — ejecuta `dart run build_runner build` manualmente',
|
|
870
|
+
'remove.success': 'Feature "{module}" eliminada exitosamente.',
|
|
871
|
+
'remove.warn.ci': 'Archivos de CI eliminados. Si tenias workflows personalizados, restauralos desde git.',
|
|
872
|
+
'remove.warn.sentry.shared': 'sentry_flutter conservado — todavia requerido por features activas (revenuecat/facebook).',
|
|
873
|
+
'cli.command.update.description': 'Actualiza partes de tu app a la última versión (ej: kasy update components)',
|
|
874
|
+
'cli.command.update.targetArg': 'Objetivo a actualizar (ej.: revenuecat, sentry, components)',
|
|
875
|
+
'update.error.noProject': 'kit_setup.json no encontrado. Ejecuta dentro de un proyecto Kasy.',
|
|
876
|
+
'update.error.unknownModule': 'Feature desconocida: {module}\nDisponibles: {list}',
|
|
877
|
+
'update.error.unknownTarget': 'Objetivo de actualización desconocido: {module}\nDisponibles: {list}',
|
|
878
|
+
'update.error.notActive': 'La feature "{module}" no está activa en este proyecto.',
|
|
879
|
+
'update.alreadyUpToDate': 'El proyecto ya está actualizado (v{versión}).',
|
|
880
|
+
'update.status': 'Proyecto: v{from} → CLI: v{to}',
|
|
881
|
+
'update.noVersion': 'El proyecto fue generado sin seguimiento de versión. Todas las features pueden actualizarse.',
|
|
882
|
+
'update.changesTitle': 'Actualizaciones disponibles:',
|
|
883
|
+
'update.reapplyTitle': 'Sin cambios nuevos — puedes reaplicar si es necesario:',
|
|
884
|
+
'update.howToUpdate': 'Para actualizar una feature:',
|
|
885
|
+
'update.howToUpdateComponents': 'Para actualizar componentes base:',
|
|
886
|
+
'update.warn.commit': 'Esto sobrescribirá los archivos de la feature "{module}". Asegúrate de haber hecho commit antes.',
|
|
887
|
+
'update.warn.commitComponents': 'Esto sobrescribirá archivos de los componentes base. Asegúrate de haber hecho commit antes.',
|
|
888
|
+
'update.confirm': 'Sobrescribir archivos de la feature "{module}" con la versión más reciente?',
|
|
889
|
+
'update.confirmComponents': 'Sobrescribir archivos de los componentes base con la versión más reciente?',
|
|
890
|
+
'update.confirmCore': 'Sobrescribir archivos de core (animaciones, widgets, tema, herramientas dev) con la versión más reciente?',
|
|
891
|
+
'update.cancelled': 'Cancelado.',
|
|
892
|
+
'update.applying': 'Aplicando actualización de la feature: {module}',
|
|
893
|
+
'update.applyingComponents': 'Aplicando actualización de componentes base...',
|
|
894
|
+
'update.applyingCore': 'Aplicando actualización de archivos de core...',
|
|
895
|
+
'update.applied': 'Feature {module} actualizada',
|
|
896
|
+
'update.appliedComponents': '{count} archivos de componentes base actualizados',
|
|
897
|
+
'update.appliedCore': '{count} archivos de core actualizados',
|
|
898
|
+
'update.applyFailed': 'Error al aplicar actualización de la feature {module}',
|
|
899
|
+
'update.applyComponentsFailed': 'Error al aplicar actualización de componentes base',
|
|
900
|
+
'update.noPatch': 'La feature "{module}" no tiene archivos para actualizar (feature solo de configuración).',
|
|
901
|
+
'update.noComponentFiles': 'No se encontraron archivos de componentes base para actualizar.',
|
|
902
|
+
'update.pubGet': 'Instalando paquetes de Flutter (flutter pub get)...',
|
|
903
|
+
'update.pubGetDone': 'Dependencias actualizadas',
|
|
904
|
+
'update.pubGetFailed': 'Falló al instalar paquetes de Flutter — ejecuta `flutter pub get` manualmente',
|
|
905
|
+
'update.buildRunner': 'Generando código (Riverpod/Freezed)...',
|
|
906
|
+
'update.buildRunnerDone': 'Generación de código completada',
|
|
907
|
+
'update.buildRunnerFailed': 'Generación de código falló — ejecuta `dart run build_runner build` manualmente',
|
|
908
|
+
'update.success': 'Feature "{module}" actualizada exitosamente.',
|
|
909
|
+
'update.componentsSuccess': 'Componentes base actualizados exitosamente.',
|
|
910
|
+
'update.coreSuccess': 'Archivos de core actualizados exitosamente.',
|
|
911
|
+
'check.intro': 'Kasy Check — Notificaciones Push',
|
|
912
|
+
'check.firebase.detected': 'Backend Firebase',
|
|
913
|
+
'check.firebase.adcInfo': 'Firebase usa Application Default Credentials — no requiere configuración extra.',
|
|
914
|
+
'check.apns.warn': 'Push iOS requiere APNs Key (no verificable via CLI)',
|
|
915
|
+
'check.apns.where': 'Firebase Console → Cloud Messaging → app iOS → Clave de autenticación APNs',
|
|
916
|
+
'check.done': 'Listo',
|
|
917
|
+
'check.notKasy': 'Este directorio no parece ser un proyecto Kasy.',
|
|
918
|
+
'check.aborted': 'Cancelado',
|
|
919
|
+
'check.supabase.notLinked': 'Proyecto Supabase no vinculado',
|
|
920
|
+
'check.supabase.notLinkedHint': 'ejecuta: supabase link --project-ref TU_REF',
|
|
921
|
+
'check.supabase.linked': 'Proyecto vinculado',
|
|
922
|
+
'check.spin.secrets': 'Verificando secrets…',
|
|
923
|
+
'check.spin.secretsDone': 'Secrets verificados',
|
|
924
|
+
'check.secrets.listFailed': 'No se pudo listar los secrets',
|
|
925
|
+
'check.secrets.checkLogin': 'verifica: supabase login',
|
|
926
|
+
'check.fbProjId.ok': 'FIREBASE_PROJECT_ID configurado',
|
|
927
|
+
'check.fbProjId.missing': 'FIREBASE_PROJECT_ID ausente',
|
|
928
|
+
'check.fbProjId.fixHint': 'Corrige: supabase secrets set FIREBASE_PROJECT_ID="{id}"',
|
|
929
|
+
'check.fbProjId.fixed': 'FIREBASE_PROJECT_ID → configurado automáticamente',
|
|
930
|
+
'check.fbProjId.fixFailed': 'FIREBASE_PROJECT_ID → falló al configurar',
|
|
931
|
+
'check.fbSak.ok': 'FIREBASE_SERVICE_ACCOUNT_JSON configurado',
|
|
932
|
+
'check.fbSak.missing': 'FIREBASE_SERVICE_ACCOUNT_JSON ausente',
|
|
933
|
+
'check.fbSak.spin': 'Generando y configurando clave FCM…',
|
|
934
|
+
'check.fbSak.spinDone': 'Clave FCM generada',
|
|
935
|
+
'check.fbSak.fixed': 'FIREBASE_SERVICE_ACCOUNT_JSON → configurado automáticamente',
|
|
936
|
+
'check.fbSak.fixFailed': 'FIREBASE_SERVICE_ACCOUNT_JSON → falló al configurar',
|
|
937
|
+
'check.fbSak.genFailed': 'FIREBASE_SERVICE_ACCOUNT_JSON → no se pudo generar la clave',
|
|
938
|
+
'check.fbSak.manual': "Manual: Firebase Console → Configuración → Cuentas de servicio → Generar clave\nLuego: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='$(cat clave.json)'",
|
|
939
|
+
'check.fbSak.hint': "Corrige automáticamente: kasy check --fix\nO manualmente: Firebase Console → Configuración → Cuentas de servicio → Generar clave\nLuego: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='$(cat clave.json)'",
|
|
940
|
+
'check.fn.spin': 'Verificando edge functions…',
|
|
941
|
+
'check.fn.spinDone': 'Edge functions verificadas',
|
|
942
|
+
'check.fn.listFailed': 'No se pudo listar edge functions',
|
|
943
|
+
'check.fn.deployed': 'Edge function send-push-notification publicada',
|
|
944
|
+
'check.fn.missing': 'Edge function send-push-notification no publicada',
|
|
945
|
+
'check.fn.deploySpin': 'Publicando send-push-notification…',
|
|
946
|
+
'check.fn.deployDone': 'send-push-notification → publicada automáticamente',
|
|
947
|
+
'check.fn.deployFailed': 'send-push-notification → falló el deploy',
|
|
948
|
+
'check.fn.hint': 'Corrige automáticamente: kasy check --fix\nO manualmente: supabase functions deploy send-push-notification',
|
|
949
|
+
'deploy.firebase.intro': 'Deploy — Firebase',
|
|
950
|
+
'deploy.firebase.spin': 'Publicando en Firebase...',
|
|
951
|
+
'deploy.firebase.spinDone': 'Deploy de Firebase completado',
|
|
952
|
+
'deploy.apns.title': 'Push iOS: configura la APNs Key en Firebase Console',
|
|
953
|
+
'deploy.apns.step1': '1. Apple Developer Portal → Keys → crear APNs Key (.p8)',
|
|
954
|
+
'deploy.apns.step2': '2. Firebase Console → Cloud Messaging → app iOS → subir APNs Key',
|
|
955
|
+
'deploy.supabase.intro': 'Deploy — Supabase',
|
|
956
|
+
'deploy.supabase.notLinked': 'Proyecto Supabase no vinculado en este directorio.',
|
|
957
|
+
'deploy.supabase.linkHint': 'Ejecuta: supabase link --project-ref TU_PROJECT_REF',
|
|
958
|
+
'deploy.supabase.projectRef': 'Project ref: {ref}',
|
|
959
|
+
'deploy.supabase.sakAlready': 'FIREBASE_SERVICE_ACCOUNT_JSON ya configurado',
|
|
960
|
+
'deploy.supabase.sakSpin': 'Generando clave FCM (Service Account)…',
|
|
961
|
+
'deploy.supabase.sakSpinDone': 'Clave FCM generada',
|
|
962
|
+
'deploy.supabase.sakManual': "Configura manualmente: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='...'",
|
|
963
|
+
'deploy.supabase.sakNoGS': 'google-services.json no encontrado — configura manualmente',
|
|
964
|
+
'deploy.supabase.fnSpin': 'Publicando edge functions…',
|
|
965
|
+
'deploy.supabase.fnSpinDone': 'Edge functions procesadas',
|
|
966
|
+
'deploy.supabase.fnNone': 'edge functions (ninguna encontrada)',
|
|
967
|
+
'deploy.outro': 'Deploy completado',
|
|
968
|
+
};
|