feat(dashboard): Add i18n support for action buttons
- Create getActionLabelKey() mapper function for action types - Map action types (approve_po, call_supplier, etc.) to i18n keys - Extract parameters from metadata (amount, supplier, customer, hours) - Update button rendering to use translations instead of backend strings Translation updates: - Add missing action keys: reject_po, complete_receipt, mark_received - Spanish translations: "Rechazar pedido", "Completar recepción", etc. - Basque translations: "Baztertu eskaera", "Osatu stockaren harrera", etc. Action buttons now respect user's language preference (EN/ES/EU) instead of showing hardcoded backend strings. Fixes: Issue #4 - Missing i18n for action buttons 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
297
frontend/src/locales/es/alerts.json
Normal file
297
frontend/src/locales/es/alerts.json
Normal file
@@ -0,0 +1,297 @@
|
||||
{
|
||||
"priority": {
|
||||
"critical": "Crítico",
|
||||
"important": "Importante",
|
||||
"standard": "Estándar",
|
||||
"info": "Info"
|
||||
},
|
||||
"type_class": {
|
||||
"action_needed": "Acción Requerida",
|
||||
"prevented_issue": "Problema Prevenido",
|
||||
"trend_warning": "Aviso de Tendencia",
|
||||
"escalation": "Escalación",
|
||||
"information": "Información"
|
||||
},
|
||||
"context": {
|
||||
"already_addressed": "La IA ya gestionó esto",
|
||||
"financial_impact": "€{amount} en riesgo",
|
||||
"time_until": "Necesita decisión en {time}",
|
||||
"can_user_fix": "Puedes solucionarlo",
|
||||
"requires_supplier": "Requiere {supplier}",
|
||||
"prevented_savings": "Ahorrado €{amount}",
|
||||
"grouped_count": "{count} agrupadas"
|
||||
},
|
||||
"actions": {
|
||||
"approve_po": "Aprobar pedido €{amount}",
|
||||
"reject_po": "Rechazar pedido",
|
||||
"call_supplier": "Llamar a {supplier} ({phone})",
|
||||
"see_reasoning": "Ver razonamiento completo",
|
||||
"complete_receipt": "Completar recepción de stock",
|
||||
"mark_received": "Marcar como recibido",
|
||||
"adjust_production": "Ajustar calendario de producción",
|
||||
"snooze": "Posponer {hours}h",
|
||||
"mark_read": "Marcar como leído",
|
||||
"dismiss": "Descartar",
|
||||
"navigate": "Ver detalles",
|
||||
"notify_customer": "Notificar a {customer}",
|
||||
"cancel_auto_action": "Cancelar acción automática"
|
||||
},
|
||||
"orchestration": {
|
||||
"reasoning_title": "🤖 Razonamiento del Orquestador Diario",
|
||||
"analyzed_title": "Esta mañana, analicé:",
|
||||
"actions_taken": "Así que programé:",
|
||||
"prevented_issues": "✅ Problemas Prevenidos",
|
||||
"estimated_impact": "Impacto Estimado",
|
||||
"impact_description": "Ahorros por prevención de pedidos urgentes, faltas de stock y desperdicios",
|
||||
"last_run": "Última ejecución",
|
||||
"what_ai_did": "Lo que hizo la IA por ti"
|
||||
},
|
||||
"metrics": {
|
||||
"hours": "{count, plural, =1 {# hora} other {# horas}}",
|
||||
"minutes": "{count, plural, =1 {# minuto} other {# minutos}}",
|
||||
"days": "{count, plural, =1 {# día} other {# días}}"
|
||||
},
|
||||
"escalated": "Escalado",
|
||||
"hub": {
|
||||
"tab_list_label": "Categorías de alertas",
|
||||
"tabs": {
|
||||
"all": "Todas las Alertas",
|
||||
"all_description": "Todas las alertas de tu panadería",
|
||||
"for_me": "Para Mí",
|
||||
"for_me_description": "Alertas asignadas a ti o que requieren tu acción",
|
||||
"archived": "Archivadas",
|
||||
"archived_description": "Alertas resueltas y descartadas"
|
||||
},
|
||||
"toggle_filters": "Activar/desactivar filtros",
|
||||
"filters": "Filtros",
|
||||
"active": "Activos"
|
||||
},
|
||||
"auto_action": {
|
||||
"title": "Acción Automática Pendiente",
|
||||
"remaining": "restante",
|
||||
"financial_impact": "Impacto:",
|
||||
"cancel_button": "Cancelar Acción Automática",
|
||||
"cancelling": "Cancelando...",
|
||||
"cancelled_title": "Acción Automática Cancelada",
|
||||
"cancelled_message": "La acción automática ha sido prevenida. Ahora puedes gestionarlo manualmente.",
|
||||
"completed_title": "Acción Automática Ejecutada",
|
||||
"help_text": "La IA ejecutará automáticamente esta acción cuando expire el temporizador. Haz clic en \"Cancelar\" para prevenirlo y gestionarlo manualmente.",
|
||||
"urgency": {
|
||||
"critical": "URGENTE",
|
||||
"warning": "PRONTO",
|
||||
"info": "PROGRAMADO"
|
||||
}
|
||||
},
|
||||
"priority_explainer": {
|
||||
"title": "Entendiendo las Puntuaciones de Prioridad",
|
||||
"subtitle": "Cómo la IA calcula qué necesita tu atención primero",
|
||||
"overview": {
|
||||
"title": "La Puntuación de Prioridad (0-100)",
|
||||
"description": "Cada alerta recibe una puntuación de prioridad de 0-100 basada en cuatro componentes ponderados. Esto te ayuda a enfocarte en lo que realmente importa para tu panadería."
|
||||
},
|
||||
"example_alert": "Prioridad de Alerta de Ejemplo",
|
||||
"level": {
|
||||
"critical": "CRÍTICO",
|
||||
"important": "IMPORTANTE",
|
||||
"standard": "ESTÁNDAR",
|
||||
"info": "INFO"
|
||||
},
|
||||
"components_title": "Componentes de la Puntuación",
|
||||
"weight": "peso",
|
||||
"business_impact": {
|
||||
"name": "Impacto Empresarial",
|
||||
"description": "Consecuencias financieras, pedidos afectados, satisfacción del cliente",
|
||||
"example1": "€500 en ingresos potenciales en riesgo",
|
||||
"example2": "10 pedidos de clientes afectados",
|
||||
"example3": "Alto impacto en la satisfacción del cliente"
|
||||
},
|
||||
"urgency": {
|
||||
"name": "Urgencia",
|
||||
"description": "Sensibilidad temporal, plazos, potencial de escalada",
|
||||
"example1": "Plazo en 2 horas",
|
||||
"example2": "Falta de stock inminente (4 horas)",
|
||||
"example3": "Ventana de producción cerrándose pronto"
|
||||
},
|
||||
"agency": {
|
||||
"name": "Capacidad de Acción del Usuario",
|
||||
"description": "¿Puedes tomar acción? ¿Tienes control sobre el resultado?",
|
||||
"example1": "Requiere tu aprobación",
|
||||
"example2": "Acción con un clic disponible",
|
||||
"example3": "Decisión necesaria dentro de tu autoridad"
|
||||
},
|
||||
"confidence": {
|
||||
"name": "Confianza de la IA",
|
||||
"description": "¿Qué tan segura está la IA sobre la validez de esta alerta?",
|
||||
"example1": "Basado en patrones históricos (95% coincidencia)",
|
||||
"example2": "Calidad de datos: Alta",
|
||||
"example3": "Precisión de predicción validada"
|
||||
},
|
||||
"formula_title": "La Fórmula",
|
||||
"footer": "Esta puntuación ayuda a la IA a priorizar alertas, asegurando que veas los problemas más importantes primero.",
|
||||
"got_it": "¡Entendido!"
|
||||
},
|
||||
"trend": {
|
||||
"near_threshold": "Cerca del umbral"
|
||||
},
|
||||
"action_preview": {
|
||||
"title": "Vista Previa de Acción",
|
||||
"outcome": "Qué sucederá",
|
||||
"financial_impact": "Impacto Financiero",
|
||||
"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}}%",
|
||||
"cancel": "Cancelar",
|
||||
"confirm": "Confirmar Acción"
|
||||
},
|
||||
"response_time": {
|
||||
"title": "Rendimiento de Tiempo de Respuesta",
|
||||
"subtitle": "Qué tan rápido respondes a las alertas",
|
||||
"on_time": "A Tiempo",
|
||||
"alerts": "alertas",
|
||||
"average": "Promedio",
|
||||
"target": "Objetivo",
|
||||
"on_time_responses": "Respuestas a Tiempo",
|
||||
"needs_improvement": "Necesita mejora",
|
||||
"benchmark_title": "Perspectiva de Rendimiento",
|
||||
"excellent": "¡Excelente! Estás respondiendo más rápido que el 80% de las panaderías. ¡Sigue así!",
|
||||
"good": "¡Buen trabajo! Intenta responder a alertas críticas dentro del tiempo objetivo para mejorar aún más.",
|
||||
"needs_work": "Respuestas más rápidas a alertas críticas pueden prevenir problemas y ahorrar dinero. Intenta cumplir los tiempos objetivo.",
|
||||
"tip": "Consejo: Activa las notificaciones móviles para responder más rápido a alertas críticas"
|
||||
},
|
||||
"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)."
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"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}}."
|
||||
},
|
||||
"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}}."
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"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}}."
|
||||
},
|
||||
"low_equipment_efficiency": {
|
||||
"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."
|
||||
},
|
||||
"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}}."
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"weather_impact_alert": {
|
||||
"title": "🌦️ Impacto Climático Esperado",
|
||||
"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}}."
|
||||
},
|
||||
"severe_weather_impact": {
|
||||
"title": "⛈️ Impacto Climático Severo",
|
||||
"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."
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"inventory_optimization": {
|
||||
"title": "📦 Optimización de Inventario",
|
||||
"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)."
|
||||
},
|
||||
"sales_opportunity": {
|
||||
"title": "💰 Oportunidad de Ventas",
|
||||
"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}})."
|
||||
},
|
||||
"cost_reduction": {
|
||||
"title": "💵 Oportunidad de Reducción de Costos",
|
||||
"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."
|
||||
},
|
||||
"quality_improvement": {
|
||||
"title": "⭐ Mejora de Calidad Recomendada",
|
||||
"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."
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"staff_optimization": {
|
||||
"title": "👥 Optimización de Personal",
|
||||
"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}}."
|
||||
},
|
||||
"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}}."
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user