Improve UI and traslations

This commit is contained in:
Urtzi Alfaro
2026-01-01 13:36:45 +01:00
parent 007cbda598
commit cba55c2805
47 changed files with 1405 additions and 999 deletions

View File

@@ -169,7 +169,7 @@
"email_required": "El correo electrónico es requerido",
"email_invalid": "Ingresa un correo electrónico válido",
"password_required": "La contraseña es requerida",
"password_min_length": "La contraseña debe tener al menos {{min}} caracteres",
"password_min_length": "La contraseña debe tener al menos {min} caracteres",
"password_weak": "La contraseña es muy débil",
"passwords_must_match": "Las contraseñas deben coincidir",
"first_name_required": "El nombre es requerido",

View File

@@ -11,7 +11,7 @@
},
"post": {
"read_more": "Leer artículo completo",
"read_time": "{{time}} min"
"read_time": "{time} min"
},
"categories": {
"management": "Gestión",

View File

@@ -375,12 +375,6 @@
"terms": "Términos",
"cookies": "Cookies"
},
"social_follow": "Síguenos en redes sociales",
"social_labels": {
"twitter": "Twitter",
"linkedin": "LinkedIn",
"github": "GitHub"
},
"made_with_love": "Hecho con amor en Madrid"
},
"breadcrumbs": {

View File

@@ -0,0 +1,83 @@
{
"hero": {
"badge": "Contacto y Soporte",
"title": "Estamos Aquí Para",
"title_accent": "Ayudarte",
"subtitle": "¿Tienes preguntas? ¿Necesitas ayuda? Nuestro equipo está listo para asistirte"
},
"methods": {
"title": "Múltiples Formas de Contactar",
"subtitle": "Elige el método que más te convenga",
"email": {
"title": "Email",
"description": "soporte@panaderia-ia.com",
"detail": "Respuesta en menos de 4 horas"
},
"phone": {
"title": "Teléfono",
"description": "+34 XXX XXX XXX",
"detail": "Lunes a Viernes: 10:00 - 19:00 CET"
},
"office": {
"title": "Oficina",
"description": "Madrid, España",
"detail": "Con cita previa"
}
},
"form": {
"title": "Envíanos un Mensaje",
"subtitle": "Completa el formulario y te responderemos lo antes posible",
"success": {
"title": "¡Mensaje enviado!",
"message": "Te responderemos pronto."
},
"error": {
"title": "Error al enviar.",
"message": "Por favor, inténtalo de nuevo."
},
"fields": {
"name": "Nombre Completo",
"name_placeholder": "Tu nombre",
"email": "Email",
"email_placeholder": "tu@email.com",
"phone": "Teléfono (opcional)",
"phone_placeholder": "+34 XXX XXX XXX",
"bakery_name": "Nombre de tu Panadería (opcional)",
"bakery_name_placeholder": "Panadería Ejemplo",
"type": "Tipo de Consulta",
"type_options": {
"general": "Consulta General",
"technical": "Soporte Técnico",
"sales": "Información Comercial",
"feedback": "Feedback/Sugerencias"
},
"subject": "Asunto",
"subject_placeholder": "¿En qué podemos ayudarte?",
"message": "Mensaje",
"message_placeholder": "Cuéntanos más sobre tu consulta o problema..."
},
"submit": "Enviar Mensaje",
"sending": "Enviando...",
"privacy": "Al enviar este formulario, aceptas nuestra <privacyLink>Política de Privacidad</privacyLink>",
"required_indicator": "*"
},
"footer": {
"hours": {
"title": "Horarios de Atención",
"email": {
"label": "Email:",
"detail": "24/7 (respuesta en menos de 4 horas en horario laboral)"
},
"phone": {
"label": "Teléfono:",
"detail": "Lunes a Viernes: 10:00 - 19:00 CET (solo clientes activos)"
}
},
"faq": {
"title": "¿Buscas Respuestas Rápidas?",
"description": "Muchas preguntas ya tienen respuesta en nuestro Centro de Ayuda y Documentación",
"help_center": "Ver Centro de Ayuda →",
"docs": "Leer Documentación →"
}
}
}

View File

@@ -190,7 +190,7 @@
}
},
"production": {
"scheduled_based_on": "Programado según {{type}}",
"scheduled_based_on": "Programado según {type}",
"status": {
"completed": "COMPLETADO",
"in_progress": "EN PROGRESO",
@@ -225,26 +225,26 @@
},
"health": {
"production_on_schedule": "Producción a tiempo",
"production_delayed": "{count} lote{count, plural, one {} other {s}} de producción retrasado{count, plural, one {} other {s}}",
"production_late_to_start": "{count} lote{count, plural, one {} other {s}} no iniciado{count, plural, one {} other {s}} a tiempo",
"production_delayed_and_late": "{delayed} lote{delayed, plural, one {} other {s}} retrasado{delayed, plural, one {} other {s}} y {late} no iniciado{late, plural, one {} other {s}}",
"production_issues": "{total} problema{total, plural, one {} other {s}} de producción",
"production_ai_prevented": "IA evitó {count} retraso{count, plural, one {} other {s}} de producción",
"production_delayed": "{count} lote{count, plural, one {} other {s} de producción retrasado{count, plural, one {} other {s}}",
"production_late_to_start": "{count} lote{count, plural, one {} other {s} no iniciado{count, plural, one {} other {s} a tiempo}}",
"production_delayed_and_late": "{delayed} lote{delayed, plural, one {} other {s} retrasado{delayed, plural, one {} other {s} y {late} no iniciado{late, plural, one {} other {s}}",
"production_issues": "{total} problema{total, plural, one {} other {s} de producción}",
"production_ai_prevented": "IA evitó {count} retraso{count, plural, one {} other {s} de producción}",
"all_ingredients_in_stock": "Todos los ingredientes en stock",
"ingredients_out_of_stock": "{count} ingrediente{count, plural, one {} other {s}} sin stock",
"inventory_ai_prevented": "IA evitó {count} problema{count, plural, one {} other {s}} de inventario",
"ingredients_out_of_stock": "{count} ingrediente{count, plural, one {} other {s} sin stock}",
"inventory_ai_prevented": "IA evitó {count} problema{count, plural, one {} other {s} de inventario}",
"no_pending_approvals": "Sin aprobaciones pendientes",
"approvals_awaiting": "{count} orden{count, plural, one {} other {es}} de compra esperando aprobación",
"procurement_ai_prevented": "IA creó {count} orden{count, plural, one {} other {es}} de compra automáticamente",
"approvals_awaiting": "{count} orden{count, plural, one {} other {es} de compra esperando aprobación}",
"procurement_ai_prevented": "IA creó {count} orden{count, plural, one {} other {es} de compra automáticamente}",
"deliveries_on_track": "Todas las entregas a tiempo",
"deliveries_overdue": "{count} entrega{count, plural, one {} other {s}} atrasada{count, plural, one {} other {s}}",
"deliveries_ai_prevented": "IA evitó {count} problema{count, plural, one {} other {s}} de entrega",
"deliveries_pending": "{count} entrega{count, plural, one {} other {s}} pendiente{count, plural, one {} other {s}}",
"deliveries_overdue": "{count} entrega{count, plural, one {} other {s} atrasada{count, plural, one {} other {s}}",
"deliveries_ai_prevented": "IA evitó {count} problema{count, plural, one {} other {s} de entrega}",
"deliveries_pending": "{count} entrega{count, plural, one {} other {s} pendiente{count, plural, one {} other {s}}",
"all_systems_operational": "Todos los sistemas operativos",
"critical_issues": "{count} problema{count, plural, one {} other {s}} crítico{count, plural, one {} other {s}}",
"critical_issues": "{count} problema{count, plural, one {} other {s} crítico{count, plural, one {} other {s}}",
"headline_green": "Tu panadería funciona sin problemas",
"headline_yellow_approvals": "Por favor revisa {count} aprobación{count, plural, one {} other {es}} pendiente{count, plural, one {} other {s}}",
"headline_yellow_alerts": "Tienes {count} alerta{count, plural, one {} other {s}} que necesita{count, plural, one {} other {n}} atención",
"headline_yellow_approvals": "Por favor revisa {count} aprobación{count, plural, one {} other {es} pendiente{count, plural, one {} other {s}}",
"headline_yellow_alerts": "Tienes {count} alerta{count, plural, one {} other {s} que necesita{count, plural, one {} other {n} atención}}",
"headline_yellow_general": "Algunos elementos necesitan tu atención",
"headline_red": "Problemas críticos requieren acción inmediata"
},
@@ -336,7 +336,7 @@
"user_needed": "Usuario Necesario",
"needs_review": "necesita tu revisión",
"all_handled": "todo manejado por IA",
"prevented_badge": "{count} problema{{count, plural, one {} other {s}}} evitado{{count, plural, one {} other {s}}}",
"prevented_badge": "{count} problema{count, plural, one {} other {s} evitado{count, plural, one {} other {s}}",
"prevented_description": "La IA manejó estos proactivamente antes de que se convirtieran en problemas",
"analyzed_title": "Lo Que Analicé",
"actions_taken": "Lo Que Hice",
@@ -473,7 +473,7 @@
"no_forecast_data": "No hay datos de pronóstico disponibles",
"no_performance_data": "No hay datos de rendimiento disponibles",
"no_distribution_data": "No hay datos de distribución disponibles",
"performance_based_on": "Rendimiento basado en {{metric}} durante {{period}} días",
"performance_based_on": "Rendimiento basado en {metric} durante {period} días",
"network_performance": "Rendimiento de Red",
"performance_description": "Comparar rendimiento en todas las tiendas de tu red",
"performance_variance": "Variación de Rendimiento",
@@ -524,7 +524,7 @@
"set_network_targets": "Establecer Objetivos de Red",
"schedule_knowledge_sharing": "Programar Compartición de Conocimientos",
"create_improvement_plan": "Crear Plan de Mejora",
"performance_based_on_period": "Rendimiento basado en {{metric}} durante {{period}} días",
"performance_based_on_period": "Rendimiento basado en {metric} durante {period} días",
"ranking": "Clasificación",
"rank": "Posición",
"outlet": "Tienda",
@@ -656,7 +656,7 @@
"new_dashboard": {
"system_status": {
"title": "Estado del Sistema",
"issues_requiring_action": "{count, plural, one {# problema requiere} other {# problemas requieren}} tu acción",
"issues_requiring_action": "{count, plural, one {# problema requiere} other {# problemas requieren} tu acción}",
"all_clear": "Todos los sistemas funcionan correctamente",
"never_run": "Nunca ejecutado",
"action_needed_label": "acción requerida",
@@ -673,7 +673,7 @@
},
"pending_purchases": {
"title": "Compras Pendientes",
"count": "{count, plural, one {# orden} other {# órdenes}} esperando aprobación",
"count": "{count, plural, one {# orden} other {# órdenes} esperando aprobación}",
"no_pending": "Sin órdenes de compra pendientes",
"all_clear": "Sin órdenes de compra pendientes de aprobación",
"po_number": "OC #{number}",
@@ -684,10 +684,10 @@
"ai_reasoning": "IA creó esta OC porque:",
"reasoning": {
"low_stock": "{ingredient} se agotará en {days, plural, =0 {menos de un día} one {# día} other {# días}}",
"low_stock_detailed": "{count, plural, one {# ingrediente crítico} other {# ingredientes críticos}} en riesgo: {products}. Agotamiento más temprano en {days, plural, =0 {<1 día} one {1 día} other {# días}}, afectando {batches, plural, one {# lote} other {# lotes}}. Pérdida potencial: €{loss}",
"low_stock_detailed": "{count, plural, one {# ingrediente crítico} other {# ingredientes críticos} en riesgo: {products}. Agotamiento más temprano en {days, plural, =0 {<1 día} one {1 día} other {# días}, afectando {batches, plural, one {# lote} other {# lotes}. Pérdida potencial: €{loss}}",
"demand_forecast": "Se espera que la demanda de {product} aumente un {increase}%",
"production_requirement": "Se necesitan {products} para {batches, plural, one {# lote} other {# lotes}} de producción en {days, plural, =0 {menos de un día} one {# día} other {# días}}",
"safety_stock": "Reabastecimiento de stock de seguridad: {count, plural, one {# producto} other {# productos}} (actual: {current}, objetivo: {target})",
"production_requirement": "Se necesitan {products} para {batches, plural, one {# lote} other {# lotes} de producción en {days, plural, =0 {menos de un día} one {# día} other {# días}}",
"safety_stock": "Reabastecimiento de stock de seguridad: {count, plural, one {# producto} other {# productos} (actual: {current}, objetivo: {target})}",
"supplier_contract": "Contrato con {supplier} para {products}",
"seasonal_demand": "Aumento estacional del {increase}% en {products} para {season}",
"forecast_demand": "Demanda prevista de {product} con {confidence}% de confianza para los próximos {period, plural, one {# día} other {# días}}"
@@ -695,7 +695,7 @@
},
"pending_deliveries": {
"title": "Entregas Pendientes",
"count": "{count, plural, one {# entrega} other {# entregas}} esperadas hoy",
"count": "{count, plural, one {# entrega} other {# entregas} esperadas hoy}",
"no_deliveries": "Sin entregas esperadas hoy",
"all_clear": "Sin entregas pendientes hoy",
"overdue_section": "Entregas Atrasadas",
@@ -709,7 +709,7 @@
},
"production_status": {
"title": "Estado de Producción",
"count": "{count, plural, one {# lote} other {# lotes}} hoy",
"count": "{count, plural, one {# lote} other {# lotes} hoy}",
"no_production": "Sin producción programada para hoy",
"all_clear": "Sin producción programada para hoy",
"late_section": "Atrasados para Empezar",
@@ -761,7 +761,7 @@
"batch_delayed": "Lote con Inicio Retrasado",
"generic": "Alerta de Producción",
"active": "Activo",
"affected_orders": "{count, plural, one {# pedido} other {# pedidos}} afectados",
"affected_orders": "{count, plural, one {# pedido} other {# pedidos} afectados}",
"delay_hours": "{hours}h de retraso",
"financial_impact": "€{amount} de impacto",
"urgent_in": "Urgente en {hours}h"

View File

@@ -40,10 +40,10 @@
"invalid_date": "Fecha inválida",
"invalid_number": "Número inválido",
"invalid_url": "URL inválida",
"min_length": "Mínimo {{min}} caracteres",
"max_length": "Máximo {{max}} caracteres",
"min_value": "Valor mínimo: {{min}}",
"max_value": "Valor máximo: {{max}}",
"min_length": "Mínimo {min} caracteres",
"max_length": "Máximo {max} caracteres",
"min_value": "Valor mínimo: {min}",
"max_value": "Valor máximo: {max}",
"invalid_format": "Formato inválido",
"invalid_selection": "Selección inválida",
"file_too_large": "Archivo demasiado grande",

View File

@@ -797,15 +797,10 @@
{
"category": "support",
"question": "¿Qué tipo de soporte ofrecen?",
"answer": "Soporte 24/7 en español por: Email (respuesta en <4h), Chat en vivo (9:00-21:00), Videollamada (con cita previa). Durante el piloto, también tienes acceso directo a los fundadores por WhatsApp."
"answer": "Soporte 24/7 en español por: Email (respuesta en <4h), Videollamada (con cita previa). Durante el piloto, también tienes acceso directo a los fundadores por WhatsApp."
}
],
"contact": {
"liveChat": {
"title": "Chat en Vivo",
"description": "Respuesta inmediata de 9:00 a 21:00",
"action": "Iniciar Chat"
},
"email": {
"title": "Email",
"description": "Respuesta en menos de 4 horas",
@@ -818,9 +813,8 @@
"action": "Ver Docs"
},
"hours": {
"liveChat": "Lunes a Viernes 9:00 - 21:00, Sábados 10:00 - 18:00",
"email": "24/7 (respuesta en menos de 4 horas en horario laboral)",
"phone": "Lunes a Viernes 10:00 - 19:00 (solo para clientes activos)"
"email": "24/7 (respuesta en 4 horas en horario laboral)",
"phone": "Lunes a Viernes 10:00 - 19:00 (solo clientes activos)"
}
},
"resources": {
@@ -840,4 +834,4 @@
"action": "Leer Tips"
}
}
}
}

View File

@@ -93,9 +93,9 @@
},
"messages": {
"training_started": "Entrenamiento iniciado para {{name}}",
"training_started": "Entrenamiento iniciado para {name}",
"training_error": "Error al iniciar el entrenamiento",
"retraining_started": "Reentrenamiento iniciado para {{name}}",
"retraining_started": "Reentrenamiento iniciado para {name}",
"retraining_error": "Error al reentrenar el modelo"
}
}

View File

@@ -244,8 +244,8 @@
"deployment": "Despliegue",
"processing": "Procesando..."
},
"estimated_time": "Tiempo estimado: {{minutes}} minutos",
"estimated_time_remaining": "Tiempo restante estimado: {{time}}",
"estimated_time": "Tiempo estimado: {minutes} minutos",
"estimated_time_remaining": "Tiempo restante estimado: {time}",
"description": "Estamos creando un modelo de IA personalizado para tu panadería basado en tus datos históricos.",
"training_info": {
"title": "¿Qué sucede durante el entrenamiento?",

View File

@@ -115,10 +115,10 @@
"auto_approve": "🤖 Auto-aprobable"
},
"messages": {
"confirm_send": "¿Enviar la orden {{po_number}} al proveedor?",
"confirm_receive": "¿Confirmar recepción de la orden {{po_number}}?",
"confirm_items": "¿Marcar items como recibidos para {{po_number}}?",
"confirm_complete": "¿Completar la orden {{po_number}}?",
"cancel_reason": "¿Por qué deseas cancelar la orden {{po_number}}?"
"confirm_send": "¿Enviar la orden {po_number} al proveedor?",
"confirm_receive": "¿Confirmar recepción de la orden {po_number}?",
"confirm_items": "¿Marcar items como recibidos para {po_number}?",
"confirm_complete": "¿Completar la orden {po_number}?",
"cancel_reason": "¿Por qué deseas cancelar la orden {po_number}?"
}
}

View File

@@ -1,10 +1,10 @@
{
"orchestration": {
"daily_summary": "{purchase_orders_count, plural, =0 {} =1 {Creé 1 orden de compra} other {Creé {purchase_orders_count} órdenes de compra}}{purchase_orders_count, plural, =0 {} other { y }}{production_batches_count, plural, =0 {ningún lote de producción} =1 {programé 1 lote de producción} other {programé {production_batches_count} lotes de producción}}. {critical_items_count, plural, =0 {Todo en stock.} =1 {1 artículo crítico necesita atención} other {{critical_items_count} artículos críticos necesitan atención}}{total_financial_impact_eur, select, 0 {} other { (€{total_financial_impact_eur} en riesgo)}}{min_depletion_hours, select, 0 {} other { - {min_depletion_hours}h hasta agotamiento}}."
"daily_summary": "{purchase_orders_count, plural, =0 {} =1 {Creé 1 orden de compra} other {Creé {purchase_orders_count} órdenes de compra}{purchase_orders_count, plural, =0 {} other { y }{production_batches_count, plural, =0 {ningún lote de producción} =1 {programé 1 lote de producción} other {programé {production_batches_count} lotes de producción}. {critical_items_count, plural, =0 {Todo en stock.} =1 {1 artículo crítico necesita atención} other {critical_items_count} artículos críticos necesitan atención}{total_financial_impact_eur, select, 0 {} other { (€{total_financial_impact_eur} en riesgo)}{min_depletion_hours, select, 0 {} other { - {min_depletion_hours}h hasta agotamiento}.}}"
},
"purchaseOrder": {
"low_stock_detection": "Stock bajo para {supplier_name}. El stock actual de {product_names_joined} se agotará en {days_until_stockout} días.",
"low_stock_detection_detailed": "{critical_product_count, plural, =1 {{critical_products_0} se agotará en {min_depletion_hours} horas} other {{critical_product_count} productos críticos escasos}}. Con entrega de {supplier_lead_time_days} días de {supplier_name}, debemos pedir {order_urgency, select, critical {INMEDIATAMENTE} urgent {HOY} important {pronto} other {ahora}} para evitar {affected_batches_count, plural, =0 {retrasos en producción} =1 {interrupción del lote {affected_batches_0}} other {interrupción de {affected_batches_count} lotes}}{potential_loss_eur, select, 0 {} other { (€{potential_loss_eur} en riesgo)}}.",
"low_stock_detection_detailed": "{critical_product_count, plural, =1 {critical_products_0} se agotará en {min_depletion_hours} horas} other {critical_product_count} productos críticos escasos}. Con entrega de {supplier_lead_time_days} días de {supplier_name}, debemos pedir {order_urgency, select, critical {INMEDIATAMENTE} urgent {HOY} important {pronto} other {ahora} para evitar {affected_batches_count, plural, =0 {retrasos en producción} =1 {interrupción del lote {affected_batches_0} other {interrupción de {affected_batches_count} lotes}{potential_loss_eur, select, 0 {} other { (€{potential_loss_eur} en riesgo)}.}}",
"forecast_demand": "Pedido programado basado en pronóstico de demanda de {forecast_period_days} días para {product_names_joined} de {supplier_name}.",
"safety_stock_replenishment": "Reposición de stock de seguridad para {product_names_joined} de {supplier_name}.",
"supplier_contract": "Pedido programado según contrato con {supplier_name}.",
@@ -23,12 +23,12 @@
"regular_schedule": "Producción programada regular de {product_name}."
},
"consequence": {
"stockout_risk": "Riesgo de desabastecimiento en {{impact_days}} días. Productos afectados: {{affected_products_joined}}.",
"insufficient_supply": "Suministro insuficiente para período de {{impact_days}} días.",
"production_delay": "Posible retraso en producción de {{delay_hours}} horas.",
"stockout_risk": "Riesgo de desabastecimiento en {impact_days} días. Productos afectados: {affected_products_joined}.",
"insufficient_supply": "Suministro insuficiente para período de {impact_days} días.",
"production_delay": "Posible retraso en producción de {delay_hours} horas.",
"customer_commitment": "Compromiso de entrega al cliente en riesgo.",
"quality_issue": "Los estándares de calidad pueden verse comprometidos.",
"cost_increase": "Los costos de materiales pueden aumentar un {{percentage}}%."
"cost_increase": "Los costos de materiales pueden aumentar un {percentage}%."
},
"severity": {
"critical": "Crítico",
@@ -50,27 +50,27 @@
"NO_DEMAND_DATA": "No hay datos históricos de demanda disponibles (se requieren mínimo 2 puntos de datos)"
},
"safetyStock": {
"statistical_z_score": "Stock de seguridad calculado con método estadístico (nivel de servicio {{service_level}}%, z-score {{z_score}}). Basado en desviación estándar de demanda {{demand_std_dev}} y tiempo de entrega de {{lead_time_days}} días. Resultado: {{safety_stock}} unidades.",
"advanced_variability": "Stock de seguridad calculado con análisis avanzado de variabilidad. Considera tanto la variabilidad de demanda (σ={{demand_std_dev}}) como la incertidumbre del tiempo de entrega (σ={{lead_time_std_dev}} días). Resultado: {{safety_stock}} unidades.",
"fixed_percentage": "Stock de seguridad establecido en {{percentage}}% de la demanda de {{lead_time_days}} días ({{lead_time_demand}} unidades). Resultado: {{safety_stock}} unidades.",
"error_lead_time_invalid": "No se puede calcular el stock de seguridad: el tiempo de entrega ({{lead_time_days}} días) o la desviación estándar de demanda ({{demand_std_dev}}) no son válidos.",
"error_insufficient_data": "Historial de demanda insuficiente para calcular stock de seguridad ({{data_points}} puntos de datos, se necesitan {{min_required}})."
"statistical_z_score": "Stock de seguridad calculado con método estadístico (nivel de servicio {service_level}%, z-score {z_score}). Basado en desviación estándar de demanda {demand_std_dev} y tiempo de entrega de {lead_time_days} días. Resultado: {safety_stock} unidades.",
"advanced_variability": "Stock de seguridad calculado con análisis avanzado de variabilidad. Considera tanto la variabilidad de demanda (σ={demand_std_dev}) como la incertidumbre del tiempo de entrega (σ={lead_time_std_dev} días). Resultado: {safety_stock} unidades.",
"fixed_percentage": "Stock de seguridad establecido en {percentage}% de la demanda de {lead_time_days} días ({lead_time_demand} unidades). Resultado: {safety_stock} unidades.",
"error_lead_time_invalid": "No se puede calcular el stock de seguridad: el tiempo de entrega ({lead_time_days} días) o la desviación estándar de demanda ({demand_std_dev}) no son válidos.",
"error_insufficient_data": "Historial de demanda insuficiente para calcular stock de seguridad ({data_points} puntos de datos, se necesitan {min_required})."
},
"priceForecaster": {
"decrease_expected": "Se espera que el precio disminuya {{change_pct}}% en los próximos {{forecast_days}} días. Actual: €{{current_price}}, pronóstico: €{{forecast_mean}}. Recomendación: Esperar mejor precio.",
"increase_expected": "Se espera que el precio aumente {{change_pct}}% en los próximos {{forecast_days}} días. Actual: €{{current_price}}, pronóstico: €{{forecast_mean}}. Recomendación: Comprar ahora para asegurar el precio actual.",
"high_volatility": "Alta volatilidad de precio detectada (CV={{coefficient}}). Cambio diario promedio de precio: {{avg_daily_change_pct}}%. Recomendación: Esperar caída de precio.",
"below_average": "El precio actual €{{current_price}} está {{below_avg_pct}}% por debajo del promedio histórico (€{{mean_price}}). Oportunidad favorable de compra.",
"stable": "El precio es estable. Actual: €{{current_price}}, pronóstico: €{{forecast_mean}} (se espera cambio de {{expected_change_pct}}%). Se recomienda tiempo de compra normal.",
"insufficient_data": "Historial de precios insuficiente para pronóstico confiable ({{history_days}} días disponibles, se necesitan {{min_required_days}} días)."
"decrease_expected": "Se espera que el precio disminuya {change_pct}% en los próximos {forecast_days} días. Actual: €{current_price}, pronóstico: €{forecast_mean}. Recomendación: Esperar mejor precio.",
"increase_expected": "Se espera que el precio aumente {change_pct}% en los próximos {forecast_days} días. Actual: €{current_price}, pronóstico: €{forecast_mean}. Recomendación: Comprar ahora para asegurar el precio actual.",
"high_volatility": "Alta volatilidad de precio detectada (CV={coefficient}). Cambio diario promedio de precio: {avg_daily_change_pct}%. Recomendación: Esperar caída de precio.",
"below_average": "El precio actual €{current_price} está {below_avg_pct}% por debajo del promedio histórico (€{mean_price}). Oportunidad favorable de compra.",
"stable": "El precio es estable. Actual: €{current_price}, pronóstico: €{forecast_mean} (se espera cambio de {expected_change_pct}%). Se recomienda tiempo de compra normal.",
"insufficient_data": "Historial de precios insuficiente para pronóstico confiable ({history_days} días disponibles, se necesitan {min_required_days} días)."
},
"optimization": {
"eoq_base": "Cantidad Económica de Pedido calculada: {{eoq}} unidades (requerido: {{required_quantity}}, demanda anual: {{annual_demand}}). Optimizado para {{optimal_quantity}} unidades.",
"moq_applied": "Restricción de cantidad mínima de pedido aplicada: {{moq}} unidades.",
"max_applied": "Restricción de cantidad máxima de pedido aplicada: {{max_qty}} unidades.",
"no_tiers": "No hay niveles de precio disponibles para este producto. Cantidad base: {{base_quantity}} unidades a €{{unit_price}} por unidad.",
"current_tier": "Nivel de precio actual: €{{current_tier_price}} por unidad para {{base_quantity}} unidades (total: €{{base_cost}}).",
"tier_upgraded": "¡Actualizado a mejor nivel de precio! Pedir {{tier_min_qty}} unidades ({{additional_qty}} extra) a €{{tier_price}} por unidad ahorra €{{savings}} comparado con {{base_quantity}} unidades a €{{base_price}}."
"eoq_base": "Cantidad Económica de Pedido calculada: {eoq} unidades (requerido: {required_quantity}, demanda anual: {annual_demand}). Optimizado para {optimal_quantity} unidades.",
"moq_applied": "Restricción de cantidad mínima de pedido aplicada: {moq} unidades.",
"max_applied": "Restricción de cantidad máxima de pedido aplicada: {max_qty} unidades.",
"no_tiers": "No hay niveles de precio disponibles para este producto. Cantidad base: {base_quantity} unidades a €{unit_price} por unidad.",
"current_tier": "Nivel de precio actual: €{current_tier_price} por unidad para {base_quantity} unidades (total: €{base_cost}).",
"tier_upgraded": "¡Actualizado a mejor nivel de precio! Pedir {tier_min_qty} unidades ({additional_qty} extra) a €{tier_price} por unidad ahorra €{savings} comparado con {base_quantity} unidades a €{base_price}."
},
"jtbd": {
"health_status": {
@@ -80,12 +80,12 @@
"green_simple": "✅ Todo listo para hoy",
"yellow_simple": "⚠️ Algunas cosas necesitan atención",
"red_simple": "🔴 Problemas críticos requieren acción",
"yellow_simple_with_count": "⚠️ {count} acción{count, plural, one {} other {es}} necesaria{count, plural, one {} other {s}}",
"yellow_simple_with_count": "⚠️ {count} acción{count, plural, one {} other {es} necesaria{count, plural, one {} other {s}}",
"last_updated": "Última actualización",
"next_check": "Próxima verificación",
"never": "Nunca",
"critical_issues": "{count} problema{count, plural, one {} other {s}} crítico{count, plural, one {} other {s}}",
"actions_needed": "{count} acción{count, plural, one {} other {es}} necesaria{count, plural, one {} other {s}}"
"critical_issues": "{count} problema{count, plural, one {} other {s} crítico{count, plural, one {} other {s}}",
"actions_needed": "{count} acción{count, plural, one {} other {es} necesaria{count, plural, one {} other {s}}"
},
"action_queue": {
"title": "Qué Necesita Tu Atención",
@@ -96,7 +96,7 @@
"estimated_time": "Tiempo estimado",
"all_caught_up": "¡Todo al día!",
"no_actions": "No hay acciones que requieran tu atención en este momento.",
"show_more": "Mostrar {count} Acción{count, plural, one {} other {es}} Más",
"show_more": "Mostrar {count} Acción{count, plural, one {} other {es} Más}",
"show_less": "Mostrar Menos",
"total": "total",
"critical": "críticas",
@@ -121,17 +121,17 @@
"run_planning": "Ejecutar Planificación Diaria",
"run_info": "Ejecución de orquestación #{runNumber}",
"took": "Duró {seconds}s",
"created_pos": "{count} orden{count, plural, one {} other {es}} de compra creada{count, plural, one {} other {s}}",
"scheduled_batches": "{count} lote{count, plural, one {} other {s}} de producción programado{count, plural, one {} other {s}}",
"created_pos": "{count} orden{count, plural, one {} other {es} de compra creada{count, plural, one {} other {s}}",
"scheduled_batches": "{count} lote{count, plural, one {} other {s} de producción programado{count, plural, one {} other {s}}",
"show_more": "Mostrar {count} más",
"show_less": "Mostrar menos",
"no_actions": "¡No se necesitan nuevas acciones - todo va según lo planeado!",
"based_on": "Basado en:",
"customer_orders": "{count} pedido{count, plural, one {} other {s}} de cliente",
"customer_orders": "{count} pedido{count, plural, one {} other {s} de cliente}",
"historical_demand": "Demanda histórica",
"inventory_levels": "Niveles de inventario",
"ai_optimization": "Optimización por IA",
"actions_required": "{count} elemento{count, plural, one {} other {s}} necesita{count, plural, one {} other {n}} tu aprobación antes de continuar",
"actions_required": "{count} elemento{count, plural, one {} other {s} necesita{count, plural, one {} other {n} tu aprobación antes de continuar}}",
"no_tenant_error": "No se encontró ID de inquilino. Por favor, asegúrate de haber iniciado sesión.",
"planning_started": "Planificación iniciada correctamente",
"planning_failed": "Error al iniciar la planificación",
@@ -170,9 +170,9 @@
}
},
"types": {
"low_stock_detection": "Stock bajo detectado para {{product_name}}. El stock se agotará en {{days_until_stockout}} días.",
"low_stock_detection": "Stock bajo detectado para {product_name}. El stock se agotará en {days_until_stockout} días.",
"stockout_prevention": "Previniendo desabastecimiento de ingredientes críticos",
"forecast_demand": "Basado en pronóstico de demanda: {{predicted_demand}} unidades predichas ({{confidence_score}}% confianza)",
"forecast_demand": "Basado en pronóstico de demanda: {predicted_demand} unidades predichas ({confidence_score}% confianza)",
"customer_orders": "Cumpliendo pedidos confirmados de clientes",
"seasonal_demand": "Aumento anticipado de demanda estacional",
"inventory_replenishment": "Reposición regular de inventario",

View File

@@ -36,7 +36,7 @@
"add_another": "Agregar Otro Proveedor",
"manage_products": "Gestionar Productos",
"products": "productos",
"products_for": "Productos para {{name}}",
"products_for": "Productos para {name}",
"add_products": "Agregar Productos",
"no_products_available": "No hay productos disponibles",
"select_products": "Seleccionar Productos",
@@ -114,12 +114,26 @@
"quantity_required": "La cantidad debe ser mayor que cero",
"expiration_past": "La fecha de vencimiento está en el pasado",
"expiring_soon": "¡Advertencia: Este ingrediente vence muy pronto!"
},
"batch_label": "Lote",
"templates": {
"basic-bakery": "Ingredientes Básicos de Panadería",
"basic-bakery-desc": "Ingredientes esenciales para cualquier panadería",
"pastry-essentials": "Esenciales de Pastelería",
"pastry-essentials-desc": "Ingredientes para pasteles y postres",
"bread-basics": "Básicos de Pan",
"bread-basics-desc": "Todo lo necesario para pan artesanal",
"chocolate-specialties": "Especialidades de Chocolate",
"chocolate-specialties-desc": "Para productos de chocolate"
}
},
"recipes": {
"why": "Las recetas conectan tu inventario con la producción. El sistema calculará los costos exactos por artículo, rastreará el consumo de ingredientes y te ayudará a optimizar la rentabilidad de tu menú.",
"quick_start": "Plantillas de Recetas",
"quick_start_desc": "Comienza con recetas probadas y personalízalas según tus necesidades",
"template_ingredients": "Ingredientes:",
"template_instructions": "Instrucciones:",
"template_tips": "Consejos:",
"category": {
"breads": "Panes",
"pastries": "Bollería",
@@ -209,17 +223,29 @@
"fields": {
"name": "Nombre Completo",
"email": "Dirección de Correo",
"password": "Contraseña",
"confirm_password": "Confirmar Contraseña",
"phone": "Teléfono",
"role": "Rol"
},
"placeholders": {
"name": "ej., María García",
"email": "ej., maria@panaderia.com"
"email": "ej., maria@panaderia.com",
"password": "••••••••",
"confirm_password": "••••••••",
"phone": "+34 600 000 000"
},
"email_hint": "Este será su nombre de usuario para iniciar sesión",
"password_hint": "Mínimo 8 caracteres",
"errors": {
"name_required": "El nombre es obligatorio",
"email_required": "El correo es obligatorio",
"email_invalid": "Formato de correo inválido",
"email_duplicate": "Este correo ya ha sido agregado"
"email_duplicate": "Este correo ya ha sido agregado",
"password_required": "La contraseña es obligatoria",
"password_min_length": "La contraseña debe tener al menos 8 caracteres",
"confirm_password_required": "Por favor confirme la contraseña",
"passwords_mismatch": "Las contraseñas no coinciden"
}
},
"review": {
@@ -240,7 +266,7 @@
"quality_title": "Plantillas de Control de Calidad",
"required": "Obligatorio",
"ready_title": "¡Tu Panadería está Lista!",
"ready_message": "Has configurado exitosamente {{suppliers}} proveedores, {{ingredients}} ingredientes y {{recipes}} recetas. Haz clic en 'Completar Configuración' para finalizar y comenzar a usar el sistema.",
"ready_message": "Has configurado exitosamente {suppliers} proveedores, {ingredients} ingredientes y {recipes} recetas. Haz clic en 'Completar Configuración' para finalizar y comenzar a usar el sistema.",
"help": "¿Necesitas hacer cambios? Usa el botón \"Atrás\" para volver a cualquier paso."
},
"completion": {

View File

@@ -213,7 +213,7 @@
},
"delete": {
"title": "Eliminar Producto del Proveedor",
"description": "¿Estás seguro de que quieres eliminar {{product}} de la lista de precios de este proveedor?"
"description": "¿Estás seguro de que quieres eliminar {product} de la lista de precios de este proveedor?"
}
},
"delete": {