New alert system and panel de control page

This commit is contained in:
Urtzi Alfaro
2025-11-27 15:52:40 +01:00
parent 1a2f4602f3
commit e902419b6e
178 changed files with 20982 additions and 6944 deletions

View File

@@ -46,6 +46,7 @@
"last_run": "Last run",
"what_ai_did": "What AI did for you"
},
"no_reasoning_available": "No reasoning available",
"metrics": {
"hours": "{count, plural, =1 {# hour} other {# hours}}",
"minutes": "{count, plural, =1 {# minute} other {# minutes}}",
@@ -135,14 +136,14 @@
"trend": {
"near_threshold": "Near threshold"
},
"action_preview": {
"action_preview": {
"title": "Action Preview",
"outcome": "What will happen",
"financial_impact": "Financial Impact",
"affected_systems": "Affected Systems",
"reversible": "This action can be undone",
"not_reversible": "This action cannot be undone",
"confidence": "AI Confidence: {{confidence}}%",
"confidence": "AI Confidence: {confidence}%",
"cancel": "Cancel",
"confirm": "Confirm Action"
},
@@ -288,8 +289,8 @@
"message": "{{shift_name}} over-staffed by {{excess_percent}}%. Consider adjusting staff levels to reduce labor costs."
},
"po_approval_needed": {
"title": "Purchase Order #{{po_number}} requires approval",
"message": "Purchase order for {{supplier_name}} totaling {{currency}} {{total_amount}} is pending approval. Delivery required by {{required_delivery_date}}."
"title": "Purchase Order #{po_number} requires approval",
"message": "Purchase order for {supplier_name} totaling {currency} {total_amount} is pending approval. Delivery required by {required_delivery_date}."
},
"production_batch_start": {
"title": "Production Batch Ready: {{product_name}}",

View File

@@ -65,8 +65,11 @@
"continue": "Continue",
"confirm": "Confirm",
"expand": "Expand",
"collapse": "Collapse"
"collapse": "Collapse",
"save_draft": "Save Draft",
"confirm_receipt": "Confirm Receipt"
},
"saved": "saved",
"item": "item",
"items": "items",
"unknown": "Unknown",
@@ -317,10 +320,6 @@
"profile_menu": "Profile menu",
"close_navigation": "Close navigation"
},
"header": {
"main_navigation": "Main navigation",
"open_menu": "Open navigation menu"
},
"footer": {
"company_description": "Intelligent management system for bakeries. Optimize your production, inventory and sales with artificial intelligence.",
"sections": {
@@ -413,9 +412,14 @@
"minimize": "Minimize",
"accept_all": "Accept All",
"accept_essential": "Essential Only",
"customize": "Customize"
"customize": "Customize",
"save_draft": "Save Draft",
"confirm_receipt": "Confirm Receipt"
},
"header": {
"main_navigation": "Main navigation",
"notifications": "Notifications",
"unread_count": "{{count}} unread notifications",
"login": "Login",
"start_free": "Start Free",
"register": "Sign Up",

View File

@@ -171,10 +171,15 @@
"health": {
"production_on_schedule": "Production on schedule",
"production_delayed": "{count} production batch{count, plural, one {} other {es}} delayed",
"production_ai_prevented": "AI prevented {count} production delay{count, plural, one {} other {s}}",
"all_ingredients_in_stock": "All ingredients in stock",
"ingredients_out_of_stock": "{count} ingredient{count, plural, one {} other {s}} out of stock",
"inventory_ai_prevented": "AI prevented {count} inventory issue{count, plural, one {} other {s}}",
"no_pending_approvals": "No pending approvals",
"approvals_awaiting": "{count} purchase order{count, plural, one {} other {s}} awaiting approval",
"procurement_ai_created": "AI created {count} purchase order{count, plural, one {} other {s}} automatically",
"deliveries_on_track": "All deliveries on track",
"deliveries_pending": "{count} pending deliver{count, plural, one {y} other {ies}}",
"all_systems_operational": "All systems operational",
"critical_issues": "{count} critical issue{count, plural, one {} other {s}}",
"headline_green": "Your bakery is running smoothly",
@@ -235,10 +240,94 @@
"complete_setup": "Complete Setup"
}
},
"action_queue_title": "Action Queue",
"total_actions": "actions",
"all_caught_up": "All Caught Up!",
"no_actions_needed": "No actions needed right now",
"orchestration": {
"no_runs_message": "No orchestration has been run yet. Click 'Run Daily Planning' to generate your first plan."
"no_runs_message": "No orchestration has been run yet. Click 'Run Daily Planning' to generate your first plan.",
"reasoning_title": "AI Orchestration Reasoning",
"no_data": "No orchestration data available yet. The AI will analyze your operations and make recommendations.",
"last_run": "Last run",
"ai_automated": "AI Automated",
"actions_completed": "actions completed",
"user_needed": "User Needed",
"needs_review": "needs your review",
"all_handled": "all handled by AI",
"prevented_badge": "{{count}} issue{{count, plural, one {} other {s}}} prevented",
"prevented_description": "AI proactively handled these before they became problems",
"analyzed_title": "What I Analyzed",
"actions_taken": "What I Did",
"prevented_issues": "Issues I Prevented",
"prevented_issues_detail": "Issue Prevention Details",
"estimated_impact": "Estimated Impact",
"impact_description": "Based on prevented stockouts, waste reduction, and optimized purchasing"
},
"errors": {
"failed_to_load_stats": "Failed to load dashboard statistics. Please try again."
},
"ai_handling_rate": {
"title": "AI Impact This Week",
"subtitle": "Issues prevented before they became problems",
"handling_rate_label": "of alerts handled automatically",
"prevented_count_label": "Prevented",
"issues_text": "issues",
"savings_label": "Savings",
"estimated_text": "estimated",
"context": "Based on {total} total alerts over the last {days} days.",
"view_prevented_issues": "View Prevented Issues",
"no_prevented_issues": "No issues prevented this week - all systems running smoothly!",
"error_title": "Unable to load AI metrics",
"error_message": "Please try again later"
},
"prevented_issues": {
"title": "Prevented Issues",
"subtitle": "AI interventions this week",
"total_savings": "Total Saved",
"celebration": "Great news! AI prevented {count} issue{plural} before they became problems.",
"ai_insight": "AI Insight:",
"show_less": "Show Less",
"show_more": "Show {{count}} More",
"no_issues": "No issues prevented this week",
"no_issues_detail": "All systems running smoothly!",
"error_title": "Unable to load prevented issues"
},
"execution_progress": {
"title": "Today's Execution Progress",
"subtitle": "Plan vs Actual",
"production": "Production",
"deliveries": "Deliveries",
"approvals": "Approvals",
"status": {
"no_plan": "No Plan",
"no_deliveries": "No Deliveries",
"completed": "Completed",
"on_track": "On Track",
"at_risk": "At Risk"
},
"no_production_plan": "No production planned for today",
"no_deliveries_today": "No deliveries scheduled for today",
"batches_complete": "batches complete",
"completed": "Completed",
"in_progress": "In Progress",
"pending": "Pending",
"received": "Received",
"overdue": "Overdue",
"pending_approvals": "Pending Approvals",
"whats_next": "What's Next",
"starts_at": "starts at"
},
"intelligent_system": {
"title": "Intelligent System Summary",
"subtitle": "AI-powered automation working for you",
"ai_handling_rate": "AI Handling Rate",
"prevented_issues": "Issues Prevented",
"estimated_savings": "Estimated Savings",
"context": "Based on {total} alerts over the last {days} days",
"prevented_issues_details": "Prevented Issues Details",
"no_prevented_issues": "No issues prevented this week - all systems running smoothly!",
"celebration": "Great news! AI prevented {count} issue(s) before they became problems.",
"ai_insight": "AI Insight:",
"orchestration_title": "Latest Orchestration Run"
}
}

View File

@@ -114,5 +114,36 @@
"INITIAL_STOCK": "Initial Stock",
"OTHER": "Other"
}
},
"stock_receipt_title": "Stock Receipt Confirmation",
"purchase_order": "Purchase Order",
"supplier_info": "Supplier Information",
"expected": "Expected",
"actual": "Actual",
"discrepancy_detected": "Discrepancy Detected",
"lot_total": "Lot Total",
"discrepancy_reason": "Discrepancy Reason",
"discrepancy_reason_placeholder": "Explain why the received quantity differs from expected...",
"lots": "Lots",
"lot_details": "Lot Details",
"quantity": "Quantity",
"supplier_lot_number": "Supplier Lot Number",
"warehouse_location": "Warehouse Location",
"storage_zone": "Storage Zone",
"quality_notes": "Quality Notes",
"quality_notes_placeholder": "Any quality observations or special handling notes...",
"add_lot": "Add Another Lot",
"receipt_notes": "Receipt Notes",
"receipt_notes_placeholder": "General notes about this delivery...",
"validation": {
"no_line_items": "At least one line item is required",
"at_least_one_lot": "At least one lot is required for each line item",
"lot_quantity_mismatch": "Lot quantities ({{actual}}) must sum to actual quantity ({{expected}})",
"expiration_required": "Expiration date is required",
"quantity_required": "Quantity must be greater than 0"
},
"errors": {
"save_failed": "Failed to save draft. Please try again.",
"confirm_failed": "Failed to confirm receipt. Please check all fields and try again."
}
}

View File

@@ -73,6 +73,10 @@
"green": "Everything is running smoothly",
"yellow": "Some items need attention",
"red": "Critical issues require immediate action",
"green_simple": "✅ Everything is ready for today",
"yellow_simple": "⚠️ Some items need attention",
"red_simple": "🔴 Critical issues require action",
"yellow_simple_with_count": "⚠️ {count} action{count, plural, one {} other {s}} needed",
"last_updated": "Last updated",
"next_check": "Next check",
"never": "Never",

View File

@@ -46,6 +46,7 @@
"last_run": "Última ejecución",
"what_ai_did": "Lo que hizo la IA por ti"
},
"no_reasoning_available": "No hay razonamiento disponible",
"metrics": {
"hours": "{count, plural, =1 {# hora} other {# horas}}",
"minutes": "{count, plural, =1 {# minuto} other {# minutos}}",
@@ -140,7 +141,7 @@
"affected_systems": "Sistemas Afectados",
"reversible": "Esta acción se puede deshacer",
"not_reversible": "Esta acción no se puede deshacer",
"confidence": "Confianza de IA: {{confidence}}%",
"confidence": "Confianza de IA: {confidence}%",
"cancel": "Cancelar",
"confirm": "Confirmar Acción"
},
@@ -161,137 +162,137 @@
},
"alerts": {
"critical_stock_shortage": {
"title": "🚨 Stock Crítico: {{ingredient_name}}",
"message_with_po_pending": "Solo {{current_stock}}kg de {{ingredient_name}} (necesitas {{required_stock}}kg). Ya creé {{po_id}} para entrega el {{delivery_day_name}}. Por favor aprueba €{{po_amount}}.",
"message_with_po_created": "Solo {{current_stock}}kg de {{ingredient_name}} (necesitas {{required_stock}}kg). Ya creé {{po_id}}. Revisa y aprueba €{{po_amount}}.",
"message_with_hours": "Solo {{current_stock}}kg de {{ingredient_name}} disponibles (necesitas {{required_stock}}kg en {{hours_until}} horas).",
"message_with_date": "Solo {{current_stock}}kg de {{ingredient_name}} disponibles (necesitas {{required_stock}}kg para producción del {{production_day_name}}).",
"message_generic": "Solo {{current_stock}}kg de {{ingredient_name}} disponibles (necesitas {{required_stock}}kg)."
"title": "🚨 Stock Crítico: {ingredient_name}",
"message_with_po_pending": "Solo {current_stock}kg de {ingredient_name} (necesitas {required_stock}kg). Ya creé {po_id} para entrega el {delivery_day_name}. Por favor aprueba €{po_amount}.",
"message_with_po_created": "Solo {current_stock}kg de {ingredient_name} (necesitas {required_stock}kg). Ya creé {po_id}. Revisa y aprueba €{po_amount}.",
"message_with_hours": "Solo {current_stock}kg de {ingredient_name} disponibles (necesitas {required_stock}kg en {hours_until} horas).",
"message_with_date": "Solo {current_stock}kg de {ingredient_name} disponibles (necesitas {required_stock}kg para producción del {production_day_name}).",
"message_generic": "Solo {current_stock}kg de {ingredient_name} disponibles (necesitas {required_stock}kg)."
},
"low_stock": {
"title": "⚠️ Stock Bajo: {{ingredient_name}}",
"message_with_po": "Stock de {{ingredient_name}}: {{current_stock}}kg (mínimo: {{minimum_stock}}kg). Ya programé PO para reposición.",
"message_generic": "Stock de {{ingredient_name}}: {{current_stock}}kg (mínimo: {{minimum_stock}}kg). Considera hacer un pedido."
"title": "⚠️ Stock Bajo: {ingredient_name}",
"message_with_po": "Stock de {ingredient_name}: {current_stock}kg (mínimo: {minimum_stock}kg). Ya programé PO para reposición.",
"message_generic": "Stock de {ingredient_name}: {current_stock}kg (mínimo: {minimum_stock}kg). Considera hacer un pedido."
},
"stock_depleted": {
"title": "📦 Stock Agotado por Pedido",
"message_with_supplier": "Pedido #{{order_id}} requiere {{ingredient_name}} pero está agotado. Contacta a {{supplier_name}} ({{supplier_phone}}).",
"message_generic": "Pedido #{{order_id}} requiere {{ingredient_name}} pero está agotado. Acción inmediata requerida."
"message_with_supplier": "Pedido #{order_id} requiere {ingredient_name} pero está agotado. Contacta a {supplier_name} ({supplier_phone}).",
"message_generic": "Pedido #{order_id} requiere {ingredient_name} pero está agotado. Acción inmediata requerida."
},
"ingredient_shortage": {
"title": "⚠️ Falta de Ingrediente en Producción",
"message_with_customers": "{{ingredient_name}} insuficiente para lotes en curso. {{affected_orders}} pedidos afectados ({{customer_names}}). Stock actual: {{current_stock}}kg, necesario: {{required_stock}}kg.",
"message_generic": "{{ingredient_name}} insuficiente para lotes en curso. Stock actual: {{current_stock}}kg, necesario: {{required_stock}}kg."
"message_with_customers": "{ingredient_name} insuficiente para lotes en curso. {affected_orders} pedidos afectados ({customer_names}). Stock actual: {current_stock}kg, necesario: {required_stock}kg.",
"message_generic": "{ingredient_name} insuficiente para lotes en curso. Stock actual: {current_stock}kg, necesario: {required_stock}kg."
},
"expired_products": {
"title": "🚫 Productos Caducados o por Caducar",
"message_with_names": "{{count}} productos caducando: {{product_names}}. Valor total: €{{total_value}}.",
"message_generic": "{{count}} productos caducando. Valor total: €{{total_value}}."
"message_with_names": "{count} productos caducando: {product_names}. Valor total: €{total_value}.",
"message_generic": "{count} productos caducando. Valor total: €{total_value}."
},
"production_delay": {
"title": "⏰ Retraso en Producción: {{batch_name}}",
"message_with_customers": "Lote {{batch_name}} retrasado {{delay_minutes}} minutos. Clientes afectados: {{customer_names}}. Hora entrega original: {{scheduled_time}}.",
"message_with_orders": "Lote {{batch_name}} retrasado {{delay_minutes}} minutos. {{affected_orders}} pedidos afectados. Hora entrega original: {{scheduled_time}}.",
"message_generic": "Lote {{batch_name}} retrasado {{delay_minutes}} minutos. Hora entrega original: {{scheduled_time}}."
"title": "⏰ Retraso en Producción: {batch_name}",
"message_with_customers": "Lote {batch_name} retrasado {delay_minutes} minutos. Clientes afectados: {customer_names}. Hora entrega original: {scheduled_time}.",
"message_with_orders": "Lote {batch_name} retrasado {delay_minutes} minutos. {affected_orders} pedidos afectados. Hora entrega original: {scheduled_time}.",
"message_generic": "Lote {batch_name} retrasado {delay_minutes} minutos. Hora entrega original: {scheduled_time}."
},
"equipment_failure": {
"title": "🔧 Fallo de Equipo: {{equipment_name}}",
"message_with_batches": "{{equipment_name}} falló. {{affected_batches}} lotes en producción afectados ({{batch_names}}).",
"message_generic": "{{equipment_name}} falló. Requiere reparación inmediata."
"title": "🔧 Fallo de Equipo: {equipment_name}",
"message_with_batches": "{equipment_name} falló. {affected_batches} lotes en producción afectados ({batch_names}).",
"message_generic": "{equipment_name} falló. Requiere reparación inmediata."
},
"maintenance_required": {
"title": "🔧 Mantenimiento Requerido: {{equipment_name}}",
"message_with_hours": "{{equipment_name}} requiere mantenimiento en {{hours_until}} horas. Programa ahora para evitar interrupciones.",
"message_with_days": "{{equipment_name}} requiere mantenimiento en {{days_until}} días. Programa antes del {{maintenance_date}}."
"title": "🔧 Mantenimiento Requerido: {equipment_name}",
"message_with_hours": "{equipment_name} requiere mantenimiento en {hours_until} horas. Programa ahora para evitar interrupciones.",
"message_with_days": "{equipment_name} requiere mantenimiento en {days_until} días. Programa antes del {maintenance_date}."
},
"low_equipment_efficiency": {
"title": "📉 Baja Eficiencia: {{equipment_name}}",
"message": "{{equipment_name}} operando a {{efficiency_percent}}% eficiencia (esperado: >{{threshold_percent}}%). Considera mantenimiento."
"title": "📉 Baja Eficiencia: {equipment_name}",
"message": "{equipment_name} operando a {efficiency_percent}% eficiencia (esperado: >{threshold_percent}%). Considera mantenimiento."
},
"order_overload": {
"title": "📊 Sobrecarga de Pedidos",
"message_with_orders": "Capacidad sobrecargada en {{overload_percent}}%. {{total_orders}} pedidos programados, capacidad: {{capacity_orders}}. Considera ajustar el calendario.",
"message_generic": "Capacidad sobrecargada en {{overload_percent}}%. Considera ajustar el calendario de producción."
"message_with_orders": "Capacidad sobrecargada en {overload_percent}%. {total_orders} pedidos programados, capacidad: {capacity_orders}. Considera ajustar el calendario.",
"message_generic": "Capacidad sobrecargada en {overload_percent}%. Considera ajustar el calendario de producción."
},
"supplier_delay": {
"title": "🚚 Retraso de Proveedor: {{supplier_name}}",
"message": "{{supplier_name}} retrasó entrega de {{ingredient_name}} (PO: {{po_id}}). Nueva fecha: {{new_delivery_date}}. Original: {{original_delivery_date}}."
"title": "🚚 Retraso de Proveedor: {supplier_name}",
"message": "{supplier_name} retrasó entrega de {ingredient_name} (PO: {po_id}). Nueva fecha: {new_delivery_date}. Original: {original_delivery_date}."
},
"temperature_breach": {
"title": "🌡️ Violación de Temperatura",
"message": "Temperatura {{location}}: {{current_temp}}°C (rango: {{min_temp}}°C-{{max_temp}}°C). Duración: {{duration_minutes}} minutos."
"message": "Temperatura {location}: {current_temp}°C (rango: {min_temp}°C-{max_temp}°C). Duración: {duration_minutes} minutos."
},
"demand_surge_weekend": {
"title": "📈 Aumento de Demanda: Fin de Semana",
"message": "Demanda esperada {{surge_percent}}% mayor para {{weekend_date}}. Productos afectados: {{products}}. Considera aumentar producción."
"message": "Demanda esperada {surge_percent}% mayor para {weekend_date}. Productos afectados: {products}. Considera aumentar producción."
},
"weather_impact_alert": {
"title": "🌦️ Impacto Climático Esperado",
"message": "{{weather_condition}} esperado {{date}}. Impacto en demanda: {{impact_percent}}%. Productos afectados: {{products}}."
"message": "{weather_condition} esperado {date}. Impacto en demanda: {impact_percent}%. Productos afectados: {products}."
},
"holiday_preparation": {
"title": "🎉 Preparación para Festivo: {{holiday_name}}",
"message": "{{holiday_name}} en {{days_until}} días ({{holiday_date}}). Demanda esperada {{expected_increase}}% mayor. Productos clave: {{products}}."
"title": "🎉 Preparación para Festivo: {holiday_name}",
"message": "{holiday_name} en {days_until} días ({holiday_date}). Demanda esperada {expected_increase}% mayor. Productos clave: {products}."
},
"severe_weather_impact": {
"title": "⛈️ Impacto Climático Severo",
"message": "{{weather_condition}} severo esperado {{date}}. Impacto en demanda: {{impact_percent}}%. Considera ajustar horarios de entrega."
"message": "{weather_condition} severo esperado {date}. Impacto en demanda: {impact_percent}%. Considera ajustar horarios de entrega."
},
"unexpected_demand_spike": {
"title": "📊 Pico de Demanda Inesperado",
"message": "Demanda aumentó {{spike_percent}}% para {{products}}. Stock actual podría agotarse en {{hours_until_stockout}} horas."
"message": "Demanda aumentó {spike_percent}% para {products}. Stock actual podría agotarse en {hours_until_stockout} horas."
},
"demand_pattern_optimization": {
"title": "💡 Optimización de Patrón de Demanda",
"message": "Patrón detectado: {{pattern_description}}. Recomienda ajustar producción de {{products}} para optimizar eficiencia."
"message": "Patrón detectado: {pattern_description}. Recomienda ajustar producción de {products} para optimizar eficiencia."
},
"inventory_optimization": {
"title": "📦 Optimización de Inventario",
"message": "{{ingredient_name}} consistentemente sobre-stock por {{excess_percent}}%. Recomienda reducir pedido a {{recommended_amount}}kg."
"message": "{ingredient_name} consistentemente sobre-stock por {excess_percent}%. Recomienda reducir pedido a {recommended_amount}kg."
},
"production_efficiency": {
"title": "⚡ Oportunidad de Eficiencia en Producción",
"message": "{{product_name}} más eficiente a las {{suggested_time}}. Tiempo de producción {{time_saved}} minutos menor ({{savings_percent}}% ahorro)."
"message": "{product_name} más eficiente a las {suggested_time}. Tiempo de producción {time_saved} minutos menor ({savings_percent}% ahorro)."
},
"sales_opportunity": {
"title": "💰 Oportunidad de Ventas",
"message": "Alta demanda de {{products}} detectada. Considera producción adicional. Ingresos potenciales: €{{potential_revenue}}."
"message": "Alta demanda de {products} detectada. Considera producción adicional. Ingresos potenciales: €{potential_revenue}."
},
"seasonal_adjustment": {
"title": "🍂 Ajuste Estacional Recomendado",
"message": "Temporada {{season}} acercándose. Ajusta producción de {{products}} basado en tendencias históricas ({{adjustment_percent}}% {{adjustment_direction}})."
"message": "Temporada {season} acercándose. Ajusta producción de {products} basado en tendencias históricas ({adjustment_percent}% {adjustment_direction})."
},
"cost_reduction": {
"title": "💵 Oportunidad de Reducción de Costos",
"message": "Cambiando a {{alternative_ingredient}} puede ahorrar €{{savings_amount}}/mes. Calidad similar, menor costo."
"message": "Cambiando a {alternative_ingredient} puede ahorrar €{savings_amount}/mes. Calidad similar, menor costo."
},
"waste_reduction": {
"title": "♻️ Oportunidad de Reducción de Desperdicio",
"message": "{{product_name}} desperdicio alto ({{waste_percent}}%). Recomienda reducir lote a {{recommended_quantity}} unidades."
"message": "{product_name} desperdicio alto ({waste_percent}%). Recomienda reducir lote a {recommended_quantity} unidades."
},
"quality_improvement": {
"title": "⭐ Mejora de Calidad Recomendada",
"message": "{{issue_description}} detectado en {{product_name}}. Acción recomendada: {{recommended_action}}."
"message": "{issue_description} detectado en {product_name}. Acción recomendada: {recommended_action}."
},
"customer_satisfaction": {
"title": "😊 Oportunidad de Satisfacción del Cliente",
"message": "Cliente {{customer_name}} consistentemente ordena {{product_name}}. Considera oferta especial o programa de lealtad."
"message": "Cliente {customer_name} consistentemente ordena {product_name}. Considera oferta especial o programa de lealtad."
},
"energy_optimization": {
"title": "⚡ Optimización de Energía",
"message": "Uso de energía para {{equipment_name}} pico a las {{peak_time}}. Cambiando a {{off_peak_start}}-{{off_peak_end}} puede ahorrar €{{savings_amount}}/mes."
"message": "Uso de energía para {equipment_name} pico a las {peak_time}. Cambiando a {off_peak_start}-{off_peak_end} puede ahorrar €{savings_amount}/mes."
},
"staff_optimization": {
"title": "👥 Optimización de Personal",
"message": "{{shift_name}} sobrestimado por {{excess_percent}}%. Considera ajustar niveles de personal para reducir costos laborales."
"message": "{shift_name} sobrestimado por {excess_percent}%. Considera ajustar niveles de personal para reducir costos laborales."
},
"po_approval_needed": {
"title": "Orden de Compra #{{po_number}} requiere aprobación",
"message": "Orden de compra para {{supplier_name}} por un total de {{currency}} {{total_amount}} pendiente de aprobación. Entrega requerida para {{required_delivery_date}}."
"title": "Orden de Compra #{po_number} requiere aprobación",
"message": "Orden de compra para {supplier_name} por un total de {currency} {total_amount} pendiente de aprobación. Entrega requerida para {required_delivery_date}."
},
"production_batch_start": {
"title": "Lote de Producción Listo: {{product_name}}",
"message": "Lote #{{batch_number}} ({{quantity_planned}} {{unit}} de {{product_name}}) está listo para comenzar. Prioridad: {{priority}}."
"title": "Lote de Producción Listo: {product_name}",
"message": "Lote #{batch_number} ({quantity_planned} {unit} de {product_name}) está listo para comenzar. Prioridad: {priority}."
}
}
}

View File

@@ -65,8 +65,11 @@
"continue": "Continuar",
"confirm": "Confirmar",
"expand": "Expandir",
"collapse": "Contraer"
"collapse": "Contraer",
"save_draft": "Guardar Borrador",
"confirm_receipt": "Confirmar Recepción"
},
"saved": "ahorrado",
"item": "artículo",
"items": "artículos",
"unknown": "Desconocido",
@@ -341,10 +344,6 @@
"profile_menu": "Menú de perfil",
"close_navigation": "Cerrar navegación"
},
"header": {
"main_navigation": "Navegación principal",
"open_menu": "Abrir menú de navegación"
},
"footer": {
"company_description": "Sistema inteligente de gestión para panaderías. Optimiza tu producción, inventario y ventas con inteligencia artificial.",
"sections": {
@@ -440,6 +439,9 @@
"customize": "Personalizar"
},
"header": {
"main_navigation": "Navegación principal",
"notifications": "Notificaciones",
"unread_count": "{{count}} notificaciones sin leer",
"login": "Iniciar Sesión",
"start_free": "Comenzar Gratis",
"register": "Registro",

View File

@@ -107,12 +107,6 @@
"hours_ago": "hace {{count}} h",
"yesterday": "Ayer"
},
"severity": {
"urgent": "Urgente",
"high": "Alta",
"medium": "Media",
"low": "Baja"
},
"types": {
"alert": "Alerta",
"recommendation": "Recomendación",
@@ -134,8 +128,6 @@
},
"filters": {
"search_placeholder": "Buscar alertas...",
"severity": "Severidad",
"category": "Categoría",
"time_range": "Periodo",
"show_snoozed": "Mostrar pospuestos",
"active_filters": "Filtros activos:",
@@ -143,7 +135,7 @@
},
"grouping": {
"by_time": "Por tiempo",
"by_category": "Por categoría",
"by_type_class": "Por tipo",
"by_similarity": "Similares",
"none": "Sin agrupar"
},
@@ -206,10 +198,15 @@
"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_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",
"no_pending_approvals": "Sin aprobaciones pendientes",
"approvals_awaiting": "{count} orden{count, plural, one {} other {es}} de compra esperando aprobación",
"procurement_ai_created": "IA creó {count} orden{count, plural, one {} other {es}} de compra automáticamente",
"deliveries_on_track": "Todas las entregas a tiempo",
"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}}",
"headline_green": "Tu panadería funciona sin problemas",
@@ -251,6 +248,28 @@
"cost_analysis": "Análisis de Costos"
}
},
"setup_banner": {
"title": "{{count}} paso(s) más para desbloquear todas las funciones",
"recommended": "(recomendado)",
"added": "agregado(s)",
"recommended_count": "Recomendado",
"dismiss": "Ocultar por 7 días",
"dismiss_info": "Puedes ocultar este banner por 7 días haciendo clic en la X",
"benefits_title": "✨ Al completar estos pasos, desbloquearás",
"benefit_1": "Análisis de costos más preciso",
"benefit_2": "Recomendaciones de IA mejoradas",
"benefit_3": "Planificación de producción optimizada"
},
"setup_wizard": {
"title": "🏗️ Configuración Necesaria",
"subtitle": "Completa estos pasos para empezar a usar tu panadería",
"progress": "Progreso",
"step": "Paso",
"of": "de",
"next": "SIGUIENTE",
"complete_to_continue": "Completa para continuar",
"setup_blocked_message": "Necesitas completar la configuración básica antes de acceder al panel de control."
},
"action_queue": {
"consequences": {
"delayed_delivery": "La entrega retrasada puede afectar el programa de producción",
@@ -270,10 +289,94 @@
"complete_setup": "Completar Configuración"
}
},
"action_queue_title": "Cola de Acciones",
"total_actions": "acciones",
"all_caught_up": "¡Todo al Día!",
"no_actions_needed": "No se necesitan acciones ahora mismo",
"orchestration": {
"no_runs_message": "Aún no se ha ejecutado ninguna orquestación. Haga clic en 'Ejecutar Planificación Diaria' para generar su primer plan."
"no_runs_message": "Aún no se ha ejecutado ninguna orquestación. Haga clic en 'Ejecutar Planificación Diaria' para generar su primer plan.",
"reasoning_title": "Razonamiento de Orquestación de IA",
"no_data": "Aún no hay datos de orquestación disponibles. La IA analizará sus operaciones y hará recomendaciones.",
"last_run": "Última ejecución",
"ai_automated": "IA Automatizada",
"actions_completed": "acciones completadas",
"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_description": "La IA manejó estos proactivamente antes de que se convirtieran en problemas",
"analyzed_title": "Lo Que Analicé",
"actions_taken": "Lo Que Hice",
"prevented_issues": "Problemas Que Evité",
"prevented_issues_detail": "Detalles de Prevención de Problemas",
"estimated_impact": "Impacto Estimado",
"impact_description": "Basado en desabastecimientos evitados, reducción de desperdicios y compras optimizadas"
},
"errors": {
"failed_to_load_stats": "Error al cargar las estadísticas del panel. Por favor, inténtelo de nuevo."
},
"ai_handling_rate": {
"title": "Impacto de IA Esta Semana",
"subtitle": "Problemas evitados antes de que se convirtieran en incidencias",
"handling_rate_label": "de alertas manejadas automáticamente",
"prevented_count_label": "Evitadas",
"issues_text": "incidencias",
"savings_label": "Ahorros",
"estimated_text": "estimados",
"context": "Basado en {total} alertas totales durante los últimos {days} días.",
"view_prevented_issues": "Ver Incidencias Evitadas",
"no_prevented_issues": "No se evitaron incidencias esta semana - ¡todos los sistemas funcionan correctamente!",
"error_title": "No se pueden cargar las métricas de IA",
"error_message": "Por favor, inténtelo de nuevo más tarde"
},
"prevented_issues": {
"title": "Incidencias Evitadas",
"subtitle": "Intervenciones de IA esta semana",
"total_savings": "Total Ahorrado",
"celebration": "¡Buenas noticias! La IA evitó {count} incidencia{plural} antes de que se convirtieran en problemas.",
"ai_insight": "Análisis de IA:",
"show_less": "Mostrar Menos",
"show_more": "Mostrar {{count}} Más",
"no_issues": "No se evitaron incidencias esta semana",
"no_issues_detail": "¡Todos los sistemas funcionan correctamente!",
"error_title": "No se pueden cargar las incidencias evitadas"
},
"execution_progress": {
"title": "Progreso de Ejecución de Hoy",
"subtitle": "Plan vs Real",
"production": "Producción",
"deliveries": "Entregas",
"approvals": "Aprobaciones",
"status": {
"no_plan": "Sin Plan",
"no_deliveries": "Sin Entregas",
"completed": "Completado",
"on_track": "En Marcha",
"at_risk": "En Riesgo"
},
"no_production_plan": "No hay producción planificada para hoy",
"no_deliveries_today": "No hay entregas programadas para hoy",
"batches_complete": "lotes completos",
"completed": "Completado",
"in_progress": "En Progreso",
"pending": "Pendiente",
"received": "Recibido",
"overdue": "Atrasado",
"pending_approvals": "Aprobaciones Pendientes",
"whats_next": "Qué Sigue",
"starts_at": "comienza a las"
},
"intelligent_system": {
"title": "Resumen del Sistema Inteligente",
"subtitle": "Automatización impulsada por IA trabajando para ti",
"ai_handling_rate": "Tasa de Gestión de IA",
"prevented_issues": "Incidencias Evitadas",
"estimated_savings": "Ahorros Estimados",
"context": "Basado en {total} alertas durante los últimos {days} días",
"prevented_issues_details": "Detalles de Incidencias Evitadas",
"no_prevented_issues": "No se evitaron incidencias esta semana - ¡todos los sistemas funcionan correctamente!",
"celebration": "¡Buenas noticias! La IA evitó {count} incidencia(s) antes de que se convirtieran en problemas.",
"ai_insight": "Análisis de IA:",
"orchestration_title": "Última Ejecución de Orquestación"
}
}

View File

@@ -73,6 +73,10 @@
"green": "Todo funciona correctamente",
"yellow": "Algunos elementos necesitan atención",
"red": "Problemas críticos requieren acción inmediata",
"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}}",
"last_updated": "Última actualización",
"next_check": "Próxima verificación",
"never": "Nunca",

View File

@@ -286,8 +286,8 @@
"message": "{{shift_name}} langileak gehiegi %{{excess_percent}}z. Langile mailak doitzea kontuan hartu lan kostuak murrizteko."
},
"po_approval_needed": {
"title": "Erosketa Agindua #{{po_number}} onarpenaren beharra",
"message": "{{supplier_name}}-(r)entzako erosketa agindua {{currency}} {{total_amount}} onarpenaren zain. Entreaga {{required_delivery_date}}-(e)rako behar da."
"title": "Erosketa Agindua #{po_number} onarpenaren beharra",
"message": "{supplier_name}-(r)entzako erosketa agindua {currency} {total_amount} onarpenaren zain. Entreaga {required_delivery_date}-(e)rako behar da."
},
"production_batch_start": {
"title": "Ekoizpen Lote Prest: {{product_name}}",

View File

@@ -65,8 +65,11 @@
"continue": "Jarraitu",
"confirm": "Berretsi",
"expand": "Zabaldu",
"collapse": "Tolestu"
"collapse": "Tolestu",
"save_draft": "Zirriborroa Gorde",
"confirm_receipt": "Harrera Berretsi"
},
"saved": "aurreztuta",
"item": "produktua",
"items": "produktuak",
"unknown": "Ezezaguna",
@@ -317,10 +320,6 @@
"profile_menu": "Profil menua",
"close_navigation": "Nabigazioa itxi"
},
"header": {
"main_navigation": "Nabigazio nagusia",
"open_menu": "Nabigazioa ireki"
},
"footer": {
"company_description": "Okindegirentzako kudeaketa sistema adimentsua. Optimizatu zure ekoizpena, inbentarioa eta salmentak adimen artifizialarekin.",
"sections": {
@@ -416,6 +415,9 @@
"customize": "Pertsonalizatu"
},
"header": {
"main_navigation": "Nabigazio nagusia",
"notifications": "Jakinarazpenak",
"unread_count": "{{count}} jakinarazpen irakurri gabeak",
"login": "Hasi Saioa",
"start_free": "Hasi Doan",
"register": "Erregistratu",

View File

@@ -169,10 +169,15 @@
"health": {
"production_on_schedule": "Ekoizpena orduan",
"production_delayed": "{count} ekoizpen sorta atzeratuta",
"production_ai_prevented": "AIk {count} ekoizpen atzerapen saihestu {count, plural, one {du} other {ditu}}",
"all_ingredients_in_stock": "Osagai guztiak stockean",
"ingredients_out_of_stock": "{count} osagai stockik gabe",
"inventory_ai_prevented": "AIk {count} inbentario arazo saihestu {count, plural, one {du} other {ditu}}",
"no_pending_approvals": "Ez dago onarpen pendienteik",
"approvals_awaiting": "{count} erosketa agindu{count, plural, one {} other {k}}} onarpenaren zai",
"procurement_ai_created": "AIk {count} erosketa agindu sortu {count, plural, one {du} other {ditu}} automatikoki",
"deliveries_on_track": "Entrega guztiak orduan",
"deliveries_pending": "{count} entrega zain",
"all_systems_operational": "Sistema guztiak martxan",
"critical_issues": "{count} arazo kritiko",
"headline_green": "Zure okindegia arazorik gabe dabil",
@@ -233,10 +238,94 @@
"complete_setup": "Konfigurazioa Osatu"
}
},
"action_queue_title": "Ekintza Ilara",
"total_actions": "ekintzak",
"all_caught_up": "Dena Eguneratuta!",
"no_actions_needed": "Ez da ekintzarik behar orain",
"orchestration": {
"no_runs_message": "Oraindik ez da orkestraziorik exekutatu. Sakatu 'Eguneko Plangintza Exekutatu' zure lehen plana sortzeko."
"no_runs_message": "Oraindik ez da orkestraziorik exekutatu. Sakatu 'Eguneko Plangintza Exekutatu' zure lehen plana sortzeko.",
"reasoning_title": "AI Orkestrazioaren Arrazoiketa",
"no_data": "Oraindik ez dago orkestrazioaren daturik eskuragarri. AIak zure eragiketak aztertuko ditu eta gomendioak egingo ditu.",
"last_run": "Azken exekuzioa",
"ai_automated": "AI Automatizatua",
"actions_completed": "ekintza osatu",
"user_needed": "Erabiltzailea Behar",
"needs_review": "zure berrikuspena behar du",
"all_handled": "guztia AIak kudeatua",
"prevented_badge": "{{count}} arazu saihestau{{count, plural, one {} other {}}",
"prevented_description": "AIak hauek proaktiboki kudeatu zituen arazo bihurtu aurretik",
"analyzed_title": "Zer Aztertu Nuen",
"actions_taken": "Zer Egin Nuen",
"prevented_issues": "Saihestutako Arazoak",
"prevented_issues_detail": "Arazo Saihespenaren Xehetasunak",
"estimated_impact": "Estimatutako Eragina",
"impact_description": "Saihestutako stockout-etan, hondakin murrizketan eta erosketa optimizatuetan oinarrituta"
},
"errors": {
"failed_to_load_stats": "Huts egin du aginte-paneleko estatistikak kargatzean. Saiatu berriro mesedez."
},
"ai_handling_rate": {
"title": "AI Eragina Aste Honetan",
"subtitle": "Arazoak gertatu aurretik saihestutakoak",
"handling_rate_label": "alertetatik automatikoki kudeatuak",
"prevented_count_label": "Saihestuta",
"issues_text": "arazoak",
"savings_label": "Aurrezkiak",
"estimated_text": "estimatuta",
"context": "{total} alerta guztiak oinarri hartuta azken {days} egunetan.",
"view_prevented_issues": "Ikusi Saihestutako Arazoak",
"no_prevented_issues": "Ez da arazorik saihestau aste honetan - sistema guztiak ondo dabiltza!",
"error_title": "Ezin dira AI metrikak kargatu",
"error_message": "Saiatu berriro mesedez"
},
"prevented_issues": {
"title": "Saihestutako Arazoak",
"subtitle": "AI esku-hartzeak aste honetan",
"total_savings": "Aurreztutako Guztira",
"celebration": "Albiste onak! AIk {count} arazu{plural} saihestau ditu arazo bihurtu aurretik.",
"ai_insight": "AI Analisia:",
"show_less": "Gutxiago Erakutsi",
"show_more": "{{count}} Gehiago Erakutsi",
"no_issues": "Ez da arazorik saihestau aste honetan",
"no_issues_detail": "Sistema guztiak ondo dabiltza!",
"error_title": "Ezin dira saihestutako arazoak kargatu"
},
"execution_progress": {
"title": "Gaurko Exekuzio Aurrerakuntza",
"subtitle": "Plana vs Erreala",
"production": "Ekoizpena",
"deliveries": "Entregak",
"approvals": "Onarpanak",
"status": {
"no_plan": "Planik Ez",
"no_deliveries": "Entregarik Ez",
"completed": "Osatua",
"on_track": "Bidean",
"at_risk": "Arriskuan"
},
"no_production_plan": "Ez dago ekoizpen planarik gaurkoz",
"no_deliveries_today": "Ez dago entregarik programatuta gaurkoz",
"batches_complete": "lote osatu",
"completed": "Osatua",
"in_progress": "Abian",
"pending": "Zain",
"received": "Jasoa",
"overdue": "Berandu",
"pending_approvals": "Onarpen Zain",
"whats_next": "Zer Dator",
"starts_at": "hasiko da"
},
"intelligent_system": {
"title": "Sistema Adimentuaren Laburpena",
"subtitle": "IA bidezko automatizazioa zuretzat lanean",
"ai_handling_rate": "IAren Kudeaketa-Tasa",
"prevented_issues": "Saihestutako Arazoak",
"estimated_savings": "Aurrezki Estimatuak",
"context": "{total} alertatan oinarrituta azken {days} egunetan",
"prevented_issues_details": "Saihestutako Arazoen Xehetasunak",
"no_prevented_issues": "Ez da arazorik saihestatu aste honetan - sistema guztiak ondo dabiltza!",
"celebration": "Albiste onak! IAk {count} arazo saihestatu ditu arazo bihurtu aurretik.",
"ai_insight": "IAren Analisia:",
"orchestration_title": "Azken Orkestraketa-Exekuzioa"
}
}

View File

@@ -73,6 +73,10 @@
"green": "Dena ondo dabil",
"yellow": "Elementu batzuek arreta behar dute",
"red": "Arazo kritikoek ekintza berehalakoa behar dute",
"green_simple": "✅ Dena prest gaur",
"yellow_simple": "⚠️ Zerbait arreta behar du",
"red_simple": "🔴 Arazo kritikoek ekintza behar dute",
"yellow_simple_with_count": "⚠️ {count} ekintza behar",
"last_updated": "Azken eguneratzea",
"next_check": "Hurrengo egiaztapena",
"never": "Inoiz ez",

View File

@@ -22,6 +22,7 @@ import featuresEs from './es/features.json';
import aboutEs from './es/about.json';
import demoEs from './es/demo.json';
import blogEs from './es/blog.json';
import alertsEs from './es/alerts.json';
// English translations
import commonEn from './en/common.json';
@@ -47,6 +48,7 @@ import featuresEn from './en/features.json';
import aboutEn from './en/about.json';
import demoEn from './en/demo.json';
import blogEn from './en/blog.json';
import alertsEn from './en/alerts.json';
// Basque translations
import commonEu from './eu/common.json';
@@ -72,6 +74,7 @@ import featuresEu from './eu/features.json';
import aboutEu from './eu/about.json';
import demoEu from './eu/demo.json';
import blogEu from './eu/blog.json';
import alertsEu from './eu/alerts.json';
// Translation resources by language
export const resources = {
@@ -99,6 +102,7 @@ export const resources = {
about: aboutEs,
demo: demoEs,
blog: blogEs,
alerts: alertsEs,
},
en: {
common: commonEn,
@@ -124,6 +128,7 @@ export const resources = {
about: aboutEn,
demo: demoEn,
blog: blogEn,
alerts: alertsEn,
},
eu: {
common: commonEu,
@@ -149,6 +154,7 @@ export const resources = {
about: aboutEu,
demo: demoEu,
blog: blogEu,
alerts: alertsEu,
},
};
@@ -185,7 +191,7 @@ export const languageConfig = {
};
// Namespaces available in translations
export const namespaces = ['common', 'auth', 'inventory', 'foodSafety', 'suppliers', 'orders', 'recipes', 'errors', 'dashboard', 'production', 'equipment', 'landing', 'settings', 'ajustes', 'reasoning', 'wizards', 'subscription', 'purchase_orders', 'help', 'features', 'about', 'demo', 'blog'] as const;
export const namespaces = ['common', 'auth', 'inventory', 'foodSafety', 'suppliers', 'orders', 'recipes', 'errors', 'dashboard', 'production', 'equipment', 'landing', 'settings', 'ajustes', 'reasoning', 'wizards', 'subscription', 'purchase_orders', 'help', 'features', 'about', 'demo', 'blog', 'alerts'] as const;
export type Namespace = typeof namespaces[number];
// Helper function to get language display name